diff --git a/CHANGELOG.md b/CHANGELOG.md index 540ccd87..c303eae1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Table of Contents - [Introduction](#introduction) +- [2021-12-10](#2021-12-10) - [2021-11-22](#2021-11-22) - [2021-11-20](#2021-11-20) - [2021-11-19](#2021-11-19) @@ -17,11 +18,27 @@ All notable changes to this project will be documented in this file. --- +## 2021-12-10 + +### Added + +- [Common Prerequisites](aws_sra_examples/solutions/common/common_prerequisites/) solution +- [Deployment Methods](aws_sra_examples/docs/DEPLOYMENT-METHODS.md) documentation +- [Staging Script](aws_sra_examples/utils/packaging_scripts/) - `stage_solution.sh` + +### Changed + +- Nothing Changed + +### Fixed + +- Nothing Fixed + ## 2021-11-22 ### Added -- EC2 Default EBS Encryption solution +- [EC2 Default EBS Encryption](aws_sra_examples/solutions/ec2/ec2_default_ebs_encryption) solution ### Changed @@ -31,7 +48,7 @@ All notable changes to this project will be documented in this file. ### Added -- S3 Block Account Public Access solution +- [S3 Block Account Public Access](aws_sra_examples/solutions/s3/s3_block_account_public_access) solution ### Changed @@ -76,9 +93,9 @@ All notable changes to this project will be documented in this file. ### Added -- AWS IAM Access Analyzer solution -- Organization AWS Config Aggregator Solution -- Common Register Delegated Administrator Solution +- [AWS IAM Access Analyzer](aws_sra_examples/solutions/iam/iam_access_analyzer/) solution +- [Organization AWS Config Aggregator](aws_sra_examples/solutions/config/config_aggregator_org/) solution +- [Common Register Delegated Administrator](aws_sra_examples/solutions/common/common_register_delegated_administrator/) solution ### Changed diff --git a/README.md b/README.md index 93049fad..711b7717 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,9 @@ The examples within this repository have been deployed and tested using the corr - CloudTrail - [Organization CloudTrail](aws_sra_examples/solutions/cloudtrail/cloudtrail_org) +- Common + - [Common Prerequisites](aws_sra_examples/solutions/common/common_prerequisites) + - [Common Register Delegated Administrator](aws_sra_examples/solutions/common/common_register_delegated_administrator) - Config - [Organization Aggregator](aws_sra_examples/solutions/config/config_aggregator_org) - [Organization Conformance Pack](aws_sra_examples/solutions/config/config_conformance_pack_org) diff --git a/aws_sra_examples/docs/DEPLOYMENT-METHODS.md b/aws_sra_examples/docs/DEPLOYMENT-METHODS.md new file mode 100644 index 00000000..2ae5867b --- /dev/null +++ b/aws_sra_examples/docs/DEPLOYMENT-METHODS.md @@ -0,0 +1,90 @@ +# Deployment Methods + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: CC-BY-SA-4.0 + +--- + +## Table of Contents + +- [Customizations for AWS Control Tower Deployment Instructions](#customizations-for-aws-control-tower-deployment-instructions) +- [References](#references) + +## Customizations for AWS Control Tower Deployment Instructions + +### Prerequisites + +1. Move the `Organizations Management Account` to an Organizational Unit (OU) (e.g. Management), so that CloudFormation StackSets can be deployed to the `Management Account` + 1. Within the AWS Control Tower console page, select `Organizational units` from the side menu, click the `Add an OU` button, and set the `OU name = Management` + 2. Within the AWS Organizations console page, select `AWS accounts` from the side menu + 1. Select the checkbox next to the `Management Account` + 2. From the `Actions` menu, select `Move` and select the new `Management OU` that was created above + 3. Select `Move AWS account` +2. Within the AWS CloudFormation StackSets console page, `Enable trusted access` with AWS Organizations to use service-managed permissions. To verify that the trusted access is enabled: + 1. Within the AWS Organizations console page, select `Services` from the side menu + 2. Verify that `CloudFormation StackSets` has `Trusted access = Access enabled` +3. Deploy the [Customizations for AWS Control Tower](https://aws.amazon.com/solutions/implementations/customizations-for-aws-control-tower/) solution following the below instructions. + 1. In the `Management account (home region)`, deploy a new CloudFormation stack with the below recommended settings: + + - `Amazon S3 URL` = https://s3.amazonaws.com/solutions-reference/customizations-for-aws-control-tower/latest/custom-control-tower-initiation.template + - `Stack name` = custom-control-tower-initiation + - `AWS CodePipeline Source` = AWS CodeCommit + - `Failure Tolerance Percentage` = 0 + - Acknowledge that AWS CloudFormation might create IAM resources with custom names + 2. On the local machine install [git](https://git-scm.com/downloads) and [git-remote-codecommit](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-connect.html). + 3. Clone the AWS CodeCommit repository via `git clone codecommit::://custom-control-tower-configuration custom-control-tower-configuration` + +### Deployment Instructions + +1. Determine which version of the [Customizations for AWS Control Tower](https://aws.amazon.com/solutions/implementations/customizations-for-aws-control-tower/) solution you have deployed: + 1. Within the `management account (home region)` find the **CloudFormation Stack** for the Customizations for Control Tower (e.g. custom-control-tower-initiation) + 2. Select the `Outputs` tab + 3. The `CustomControlTowerSolutionVersion` **Value** is the version running in the environment + 1. Version 1 = v1.x.x = manifest.yaml version 2020-01-01 + 2. Version 2 = v2.x.x = manifest.yaml version 2021-03-15 +2. Create the `AWSControlTowerExecution` IAM role in the `management account (home region)` by launching an AWS CloudFormation **Stack** using the + [sra-common-prerequisites-control-tower-execution-role.yaml](../solutions/common/common_prerequisites/templates/sra-common-prerequisites-control-tower-execution-role.yaml) template file as the source. +3. Follow the instructions for the cooresponding version: + - [Version 1 Deployment Instructions](#version-1-deployment-instructions) + - [Version 2 Deployment Instructions](#version-2-deployment-instructions) + +#### Version 1 Deployment Instructions + +1. Copy the files to the Customizations for AWS Control Tower configuration `custom-control-tower-configuration` + - parameters [**required for manifest version 2020-01-01**] + - Copy the parameter files from the `parameters` folder + - Only one of the main parameter files is required. We recommend using the main-ssm file. + - policies [optional] + - service control policies files (\*.json) + - templates [**required**] + - Copy the template files from the `templates` folder + - Only one of the main template files is required. We recommend using the main-ssm file. + - `manifest.yaml` [**required**] +2. Verify and update the parameters within each of the parameter json files to match the target environment +3. Update the manifest.yaml file with the `organizational unit names`, `account names` and `SSM parameters` for the target environment +4. Deploy the Customizations for AWS Control Tower configuration by pushing the code to the `AWS CodeCommit` repository or uploading to the `AWS S3 Bucket` + +#### Version 2 Deployment Instructions + +1. Copy the files to the Customizations for AWS Control Tower configuration `custom-control-tower-configuration` + - policies [optional] + - service control policies files (\*.json) + - templates [**required**] + - Copy the template files from the `templates` folder + - `manifest-v2.yaml` [**required**] +2. Rename the `manifest-v2.yaml` to `manifest.yaml` +3. Update the manifest.yaml file with the `parameters`, `organizational unit names`, `account names` and `SSM parameters` for the target environment +4. Deploy the Customizations for AWS Control Tower configuration by pushing the code to the `AWS CodeCommit` repository or uploading to the `AWS S3 Bucket` + +### Delete Instructions + +1. Within the Customizations for AWS Control Tower configuration + 1. Remove the solution configuration from the `manifest.yaml` file + 2. (Optional) Delete the parameter (Version 1 only) and template files for the solution +2. Deploy the Customizations for AWS Control Tower configuration +3. After the pipeline completes, log into the `management account` and navigate to the `CloudFormation StackSet` page + 1. Delete the Stack Instances from the `CustomControlTower-*` CloudFormation StackSets + 2. After the Stack Instances are deleted, delete the `CustomControlTower-*` CloudFormation StackSets + +## References + +- [Customizations for AWS Control Tower](https://aws.amazon.com/solutions/implementations/customizations-for-aws-control-tower/) diff --git a/aws_sra_examples/solutions/common/common_prerequisites/README.md b/aws_sra_examples/solutions/common/common_prerequisites/README.md new file mode 100644 index 00000000..f4856a78 --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/README.md @@ -0,0 +1,157 @@ +# SRA Prerequisites + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: CC-BY-SA-4.0 + +## Table of Contents + +- [Introduction](#introduction) +- [Deployed Resource Details](#deployed-resource-details) +- [Implementation Instructions](#implementation-instructions) +- [References](#references) + +## Introduction + +The `SRA Prerequisites Solution` creates the resources (`Staging S3 Buckets` and `Execution IAM Role`) and configuration (`SSM Parameters`) for simplifying the deployment of SRA solutions within an AWS Control Tower environment. All resources that support tags are provided a tag keypair of `sra-solution: sra-common-prerequisites`. + +## Deployed Resource Details + +![Architecture](./documentation/common-prerequisites.png) + +### 1.0 Organization Management Account + +#### 1.1 AWS CloudFormation + +- All resources are deployed via AWS CloudFormation as a StackSet and Stack Instance within the management account or a CloudFormation Stack within a specific account. +- The [Customizations for AWS Control Tower](https://aws.amazon.com/solutions/implementations/customizations-for-aws-control-tower/) solution deploys all templates as a CloudFormation `StackSet`. +- For parameter details, review the AWS [CloudFormation templates](templates/). + +#### 1.2 Org ID AWS Lambda IAM Role + +- The AWS Org ID Lambda IAM Role allows the AWS Lambda service to assume the role and perform actions defined in the attached IAM policies. + +#### 1.3 Org ID AWS Lambda Function + +- An external deployment package is used in the AWS Lambda Function in the [sra-common-prerequisites-staging-s3-bucket.yaml](templates/sra-common-prerequisites-staging-s3-bucket.yaml) that contains the logic to determine the AWS Organization ID +- The function is triggered by CloudFormation Create, Update, and Delete events. + +#### 1.4 AWS Lambda CloudWatch Log Group + +- `AWS Lambda Function` logs are sent to a CloudWatch Log Group `` to help with debugging and traceability of the actions performed. +- By default the `AWS Lambda Function` will create the CloudWatch Log Group with a `Retention` (Never expire) and the logs are encrypted with a CloudWatch Logs service managed encryption key. +- Optional parameters are included to allow creating the CloudWatch Log Group, which allows setting `KMS Encryption` using a customer managed KMS key and setting the `Retention` to a specific value (e.g. 14 days). + +#### 1.5 AWS SSM Parameter Store + +- Configuration parameters are created/updated within the `SSM Parameter Store` on CloudFormation events and the parameters are used to simplify deployment of this solution and future SRA solutions. +- All parameters are created under the `/sra/` hierarchy path in all regions of the `management account`. +- Optional parameters are included to create the parameters in all `member accounts` in the same regions that are enabled in the `management account`. + - This allows for common SSM parameters to be resolved in the `member accounts` for future SRA solutions, and customer workload solutions. +- Common parameters created will be retained even if the CloudFormation stacks from this solution are deleted. + +#### 1.6 Staging S3 Bucket + +- The S3 Bucket is used to store solution files (Lambda Zip files, CloudFormation templates, and other deployment files) that will be used for staging. +- S3 bucket is created in all regions of the `management account` with a name following this syntax: `sra-staging--`. +- Optional parameters are included to create an S3 bucket in all `member accounts` in the same regions that are enabled in the `management account` with a name following this syntax: `sra-staging--`. + - This allows for a staging S3 bucket to be used in the `member accounts` for future SRA solutions, and customer workload solutions. + +#### 1.7 Parameter AWS Lambda IAM Role + +- The AWS Lambda Function Role allows the AWS Lambda service to assume the role and perform actions defined in the attached IAM policies. + +#### 1.8 Parameter AWS Lambda Function + +- An inline AWS Lambda Function in the [sra-common-prerequisites-management-account-parameters.yaml](templates/sra-common-prerequisites-management-account-parameters.yaml) contains the logic for discovering common values in your Control Tower landing + zone. (e.g., Root Organizational Unit ID, Control Tower Home Region, Audit Account ID) +- The function is triggered by CloudFormation Create, Update, and Delete events. + +#### 1.9 AWS Lambda CloudWatch Log Group + +- See [1.4 AWS Lambda CloudWatch Log Group](#14-aws-lambda-cloudwatch-log-group) + +#### 1.10 AWS Control Tower Execution Role + +- The `AWSControlTowerExecution` Role provides the support needed to deploy solutions to the `management account` across regions as CloudFormation `StackSets`. + +#### 1.11 AWS SSM Parameter Store + +- See [1.5 AWS SSM Parameter Store](#15-aws-ssm-parameter-store) + +#### 1.12 Staging S3 Bucket + +- See [1.6 Staging S3 Bucket](#16-staging-s3-bucket) + +### All Existing and Future Organization Member Accounts + +#### 2.1 AWS CloudFormation + +- See [1.1 AWS CloudFormation](#11-aws-cloudformation) + +#### 2.2 AWS SSM Parameter Store + +- See [1.5 AWS SSM Parameter Store](#15-aws-ssm-parameter-store) + +#### 2.3 Staging S3 Bucket + +- See [1.6 Staging S3 Bucket](#16-staging-s3-bucket) + +## Implementation Instructions + +### Prerequisites + +- AWS Control Tower is deployed. +- `aws-security-reference-architecture-examples` repository is stored on your local machine or pipeline where you will be deploying from. +- **Note:** If the parameter `Create SRA Staging S3 Bucket in Member Accounts = true`, make sure the following elective AWS Control Tower guardrails are disabled for all OUs: + - Disallow Changes to Encryption Configuration for Amazon S3 Buckets + - Disallow Changes to Logging Configuration for Amazon S3 Buckets + - Disallow Changes to Bucket Policy for Amazon S3 Buckets + - Disallow Changes to Lifecycle Configuration for Amazon S3 Buckets + +### Solution Deployment + +1. In the `management account (home region)`, launch the AWS CloudFormation **Stack** using the [sra-common-prerequisites-staging-s3-bucket.yaml](templates/sra-common-prerequisites-staging-s3-bucket.yaml) template file as the source. +2. Package the solution, see the [Staging](#staging) instructions. +3. Choose a Deployment Method: + - [AWS CloudFormation](#aws-cloudformation) + - [Customizations for AWS Control Tower](../../../docs/DEPLOYMENT-METHODS.md#customizations-for-aws-control-tower-deployment-instructions) + +#### AWS CloudFormation + +1. In the `management account (home region)`, launch the AWS CloudFormation **Stack** using the [sra-common-prerequisites-management-account-parameters.yaml](templates/sra-common-prerequisites-management-account-parameters.yaml) template file as the + source. +2. In the `management account (home region)`, launch the AWS CloudFormation **Stack** using the template file as the source from the below chosen options: + - **Option 1:** (Recommended) Use this template, [sra-common-prerequisites-main-ssm.yaml](templates/sra-common-prerequisites-main-ssm.yaml), for a more automated approach where CloudFormation parameters resolve SSM parameters. + - **Option 2:** Use this template, [sra-common-prerequisites-main.yaml](templates/sra-common-prerequisites-main.yaml), where input is required for the CloudFormation parameters, without resolving SSM parameters. + +### Staging + +1. Package the Lambda code into a zip file and upload the solution files (Lambda Zip files, CloudFormation templates, and other deployment files) to the SRA Staging S3 bucket (from above step), using the + [Packaging script](../../../utils/packaging_scripts/stage_solution.sh). + + - `SRA_REPO` environment variable should point to the folder where `aws-security-reference-architecture-examples` repository is stored. + - `BUCKET` environment variable should point to the S3 Bucket where the solution files are stored. + - See CloudFormation Output from Step 1 in the [Solution Deployment](#solution-deployment) instructions. Or follow this syntax: `sra-staging--` + + ```bash + # Example (assumes repository was downloaded to your home directory) + export SRA_REPO="$HOME"/aws-security-reference-architecture-examples/aws_sra_examples + export BUCKET=sra-staging-123456789012-us-east-1 + sh "$SRA_REPO"/utils/packaging_scripts/stage_solution.sh \ + --staging_bucket_name $BUCKET \ + --solution_directory "$SRA_REPO"/solutions/common/common_prerequisites + ``` + + ```bash + # Use template below and set the 'SRA_REPO' and 'SRA_BUCKET' with your values. + export SRA_REPO= + export BUCKET= + sh "$SRA_REPO"/utils/packaging_scripts/stage_solution.sh \ + --staging_bucket_name $BUCKET \ + --solution_directory "$SRA_REPO"/solutions/common/common_prerequisites + ``` + +## References + +- [How AWS Control Tower works with roles to create and manage accounts](https://docs.aws.amazon.com/controltower/latest/userguide/roles-how.html) +- [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) +- [Working with AWS CloudFormation StackSets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html) diff --git a/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/README.md b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/README.md new file mode 100644 index 00000000..a96b715d --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/README.md @@ -0,0 +1,7 @@ +# Customizations for AWS Control Tower + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: CC-BY-SA-4.0 + +--- + +[Customizations for AWS Control Tower Deployment Instructions](../../../docs/DEPLOYMENT-METHODS.md#customizations-for-aws-control-tower-deployment-instructions) diff --git a/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/manifest-v2.yaml b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/manifest-v2.yaml new file mode 100644 index 00000000..15286c35 --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/manifest-v2.yaml @@ -0,0 +1,91 @@ +--- +#Default region for deploying Custom Control Tower: Code Pipeline, Step functions, Lambda, SSM parameters, and StackSets +region: us-east-1 +version: 2021-03-15 + +# Control Tower Custom Resources (Service Control Policies or CloudFormation) +resources: + # ----------------------------------------------------------------------------- + # Common Prerequisites + # ----------------------------------------------------------------------------- + - name: sra-common-prerequisites-management-account-parameters + resource_file: templates/sra-common-prerequisites-management-account-parameters.yaml + parameters: + - parameter_key: pCreateLambdaLogGroup + parameter_value: 'false' + - parameter_key: pLambdaLogGroupKmsKey + parameter_value: '' + - parameter_key: pLambdaLogGroupRetention + parameter_value: '14' + - parameter_key: pLambdaLogLevel + parameter_value: INFO + - parameter_key: pSRAStagingS3BucketName + parameter_value: + deploy_method: stack_set + deployment_targets: + accounts: + - REPLACE_ME_ORG_MANAGEMENT_ACCOUNT_NAME + + - name: sra-common-prerequisites-main-ssm + resource_file: templates/sra-common-prerequisites-main-ssm.yaml + parameters: + - parameter_key: pCreateAWSControlTowerExecutionRole + parameter_value: 'false' + - parameter_key: pCreateLambdaLogGroup + parameter_value: 'false' + - parameter_key: pCreateSRAStagingS3BucketInMemberAccounts + parameter_value: 'false' + - parameter_key: pCreateSSMParametersInMemberAccounts + parameter_value: 'true' + - parameter_key: pLambdaLogGroupKmsKey + parameter_value: '' + - parameter_key: pLambdaLogGroupRetention + parameter_value: '14' + - parameter_key: pLambdaLogLevel + parameter_value: INFO + deploy_method: stack_set + deployment_targets: + accounts: + - REPLACE_ME_ORG_MANAGEMENT_ACCOUNT_NAME + + # - name: sra-common-prerequisites-main + # resource_file: templates/sra-common-prerequisites-main.yaml + # parameters: + # - parameter_key: pAuditAccountId + # parameter_value: '' + # - parameter_key: pCreateAWSControlTowerExecutionRole + # parameter_value: 'false' + # - parameter_key: pCreateLambdaLogGroup + # parameter_value: 'false' + # - parameter_key: pCreateSRAStagingS3BucketInMemberAccounts + # parameter_value: 'false' + # - parameter_key: pCreateSSMParametersInMemberAccounts + # parameter_value: 'true' + # - parameter_key: pCustomerControlTowerRegions + # parameter_value: '' + # - parameter_key: pCustomerControlTowerRegionsWithoutHomeRegion + # parameter_value: '' + # - parameter_key: pEnabledRegions + # parameter_value: '' + # - parameter_key: pEnabledRegionsWithoutHomeRegion + # parameter_value: '' + # - parameter_key: pHomeRegion + # parameter_value: '' + # - parameter_key: pLambdaLogGroupKmsKey + # parameter_value: '' + # - parameter_key: pLambdaLogGroupRetention + # parameter_value: '14' + # - parameter_key: pLambdaLogLevel + # parameter_value: INFO + # - parameter_key: pLogArchiveAccountId + # parameter_value: '' + # - parameter_key: pManagementAccountId + # parameter_value: '' + # - parameter_key: pOrganizationId + # parameter_value: '' + # - parameter_key: pRootOrganizationalUnitId + # parameter_value: '' + # deploy_method: stack_set + # deployment_targets: + # accounts: + # - REPLACE_ME_ORG_MANAGEMENT_ACCOUNT_NAME diff --git a/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/manifest.yaml b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/manifest.yaml new file mode 100644 index 00000000..026c46b3 --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/manifest.yaml @@ -0,0 +1,33 @@ +--- +#Default region for deploying Custom Control Tower: Code Pipeline, Step functions, Lambda, SSM parameters, and StackSets +region: us-east-1 +version: 2020-01-01 + +# Control Tower Custom Service Control Policies +organization_policies: [] + +# Control Tower Custom CloudFormation Resources +cloudformation_resources: + # ----------------------------------------------------------------------------- + # Common Prerequisites + # ----------------------------------------------------------------------------- + - name: sra-common-prerequisites-management-account-parameters + template_file: templates/sra-common-prerequisites-management-account-parameters.yaml + parameter_file: parameters/sra-common-prerequisites-management-account-parameters.json + deploy_method: stack_set + deploy_to_account: + - REPLACE_ME_ORG_MANAGEMENT_ACCOUNT_NAME + + - name: sra-common-prerequisites-main-ssm + template_file: templates/sra-common-prerequisites-main-ssm.yaml + parameter_file: parameters/sra-common-prerequisites-main-ssm.json + deploy_method: stack_set + deploy_to_account: + - REPLACE_ME_ORG_MANAGEMENT_ACCOUNT_NAME + + # - name: sra-common-prerequisites-main + # template_file: templates/sra-common-prerequisites-main.yaml + # parameter_file: parameters/sra-common-prerequisites-main.json + # deploy_method: stack_set + # deploy_to_account: + # - REPLACE_ME_ORG_MANAGEMENT_ACCOUNT_NAME diff --git a/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/parameters/sra-common-prerequisites-main-ssm.json b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/parameters/sra-common-prerequisites-main-ssm.json new file mode 100644 index 00000000..59d3db8e --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/parameters/sra-common-prerequisites-main-ssm.json @@ -0,0 +1,30 @@ +[ + { + "ParameterKey": "pCreateAWSControlTowerExecutionRole", + "ParameterValue": "false" + }, + { + "ParameterKey": "pCreateLambdaLogGroup", + "ParameterValue": "false" + }, + { + "ParameterKey": "pCreateSRAStagingS3BucketInMemberAccounts", + "ParameterValue": "false" + }, + { + "ParameterKey": "pCreateSSMParametersInMemberAccounts", + "ParameterValue": "true" + }, + { + "ParameterKey": "pLambdaLogGroupKmsKey", + "ParameterValue": "" + }, + { + "ParameterKey": "pLambdaLogGroupRetention", + "ParameterValue": "14" + }, + { + "ParameterKey": "pLambdaLogLevel", + "ParameterValue": "INFO" + } +] \ No newline at end of file diff --git a/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/parameters/sra-common-prerequisites-main.json b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/parameters/sra-common-prerequisites-main.json new file mode 100644 index 00000000..57e82cd9 --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/parameters/sra-common-prerequisites-main.json @@ -0,0 +1,70 @@ +[ + { + "ParameterKey": "pAuditAccountId", + "ParameterValue": "" + }, + { + "ParameterKey": "pCreateAWSControlTowerExecutionRole", + "ParameterValue": "false" + }, + { + "ParameterKey": "pCreateLambdaLogGroup", + "ParameterValue": "false" + }, + { + "ParameterKey": "pCreateSRAStagingS3BucketInMemberAccounts", + "ParameterValue": "false" + }, + { + "ParameterKey": "pCreateSSMParametersInMemberAccounts", + "ParameterValue": "true" + }, + { + "ParameterKey": "pCustomerControlTowerRegions", + "ParameterValue": "" + }, + { + "ParameterKey": "pCustomerControlTowerRegionsWithoutHomeRegion", + "ParameterValue": "" + }, + { + "ParameterKey": "pEnabledRegions", + "ParameterValue": "" + }, + { + "ParameterKey": "pEnabledRegionsWithoutHomeRegion", + "ParameterValue": "" + }, + { + "ParameterKey": "pHomeRegion", + "ParameterValue": "" + }, + { + "ParameterKey": "pLambdaLogGroupKmsKey", + "ParameterValue": "" + }, + { + "ParameterKey": "pLambdaLogGroupRetention", + "ParameterValue": "14" + }, + { + "ParameterKey": "pLambdaLogLevel", + "ParameterValue": "INFO" + }, + { + "ParameterKey": "pLogArchiveAccountId", + "ParameterValue": "" + }, + { + "ParameterKey": "pManagementAccountId", + "ParameterValue": "" + }, + { + "ParameterKey": "pOrganizationId", + "ParameterValue": "" + }, + { + "ParameterKey": "pRootOrganizationalUnitId", + "ParameterValue": "" + } +] \ No newline at end of file diff --git a/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/parameters/sra-common-prerequisites-management-account-parameters.json b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/parameters/sra-common-prerequisites-management-account-parameters.json new file mode 100644 index 00000000..521c1099 --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/customizations_for_aws_control_tower/parameters/sra-common-prerequisites-management-account-parameters.json @@ -0,0 +1,22 @@ +[ + { + "ParameterKey": "pCreateLambdaLogGroup", + "ParameterValue": "false" + }, + { + "ParameterKey": "pLambdaLogGroupKmsKey", + "ParameterValue": "" + }, + { + "ParameterKey": "pLambdaLogGroupRetention", + "ParameterValue": "14" + }, + { + "ParameterKey": "pLambdaLogLevel", + "ParameterValue": "INFO" + }, + { + "ParameterKey": "pSRAStagingS3BucketName", + "ParameterValue": "" + } +] \ No newline at end of file diff --git a/aws_sra_examples/solutions/common/common_prerequisites/documentation/common-prerequisites.png b/aws_sra_examples/solutions/common/common_prerequisites/documentation/common-prerequisites.png new file mode 100644 index 00000000..4e2a8994 Binary files /dev/null and b/aws_sra_examples/solutions/common/common_prerequisites/documentation/common-prerequisites.png differ diff --git a/aws_sra_examples/solutions/common/common_prerequisites/documentation/common-prerequisites.pptx b/aws_sra_examples/solutions/common/common_prerequisites/documentation/common-prerequisites.pptx new file mode 100644 index 00000000..153e37f3 Binary files /dev/null and b/aws_sra_examples/solutions/common/common_prerequisites/documentation/common-prerequisites.pptx differ diff --git a/aws_sra_examples/solutions/common/common_prerequisites/lambda/src/app.py b/aws_sra_examples/solutions/common/common_prerequisites/lambda/src/app.py new file mode 100644 index 00000000..f694b745 --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/lambda/src/app.py @@ -0,0 +1,433 @@ +"""Custom Resource to gather data and create SSM paramters in the Control Tower management account. +Version: 1.0 + +'common_prerequisites' solution in the repo, https://github.com/aws-samples/aws-security-reference-architecture-examples + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: MIT-0 +""" +from __future__ import annotations + +import logging +import os +import re +from time import sleep +from typing import TYPE_CHECKING, Literal, Sequence, Union + +import boto3 +from botocore.exceptions import ClientError, EndpointConnectionError +from crhelper import CfnResource + +if TYPE_CHECKING: + from aws_lambda_typing.context import Context + from aws_lambda_typing.events import CloudFormationCustomResourceEvent + from mypy_boto3_cloudformation import CloudFormationClient + from mypy_boto3_organizations import OrganizationsClient + from mypy_boto3_ssm import SSMClient + from mypy_boto3_ssm.type_defs import TagTypeDef + +# Setup Default Logger +LOGGER = logging.getLogger(__name__) +log_level = os.environ.get("LOG_LEVEL", logging.ERROR) +LOGGER.setLevel(log_level) + +# Global Variables +CLOUDFORMATION_THROTTLE_PERIOD = 0.2 +CLOUDFORMATION_PAGE_SIZE = 100 +SSM_DELETE_PARAMETERS_MAX = 10 +SRA_CONTROL_TOWER_SSM_PATH = "/sra/control-tower" +SRA_REGIONS_SSM_PATH = "/sra/regions" +SRA_SSM_PARAMETERS = [ + "/sra/control-tower/root-organizational-unit-id", + "/sra/control-tower/organization-id", + "/sra/control-tower/management-account-id", + "/sra/control-tower/home-region", + "/sra/control-tower/audit-account-id", + "/sra/control-tower/log-archive-account-id", + "/sra/regions/enabled-regions", + "/sra/regions/enabled-regions-without-home-region", + "/sra/regions/customer-control-tower-regions", + "/sra/regions/customer-control-tower-regions-without-home-region", +] + +# Initialize the helper +helper = CfnResource(json_logging=True, log_level=log_level, boto_level="CRITICAL", sleep_on_delete=120) + +try: + MANAGEMENT_ACCOUNT_SESSION = boto3.Session() + ORG_CLIENT: OrganizationsClient = MANAGEMENT_ACCOUNT_SESSION.client("organizations") + CFN_CLIENT: CloudFormationClient = MANAGEMENT_ACCOUNT_SESSION.client("cloudformation") +except Exception as error: + LOGGER.error({"Unexpected_Error": error}) + raise ValueError("Unexpected error executing Lambda function. Review CloudWatch logs for details.") from None + + +def add_tags_to_ssm_parameter(ssm_client: SSMClient, resource_id: str, tags: Sequence[TagTypeDef]) -> None: + """Add tags to SSM parameter. + + Args: + ssm_client: Boto3 SSM client + resource_id: SSM parameter name + tags: Tags to apply to SSM parameter + """ + response = ssm_client.add_tags_to_resource(ResourceType="Parameter", ResourceId=resource_id, Tags=tags) + LOGGER.debug({"API_Call": "ssm:AddTagsToResource", "API_Response": response}) + + +def create_ssm_parameter(ssm_client: SSMClient, name: str, value: str, parameter_type: Union[Literal["String"], Literal["StringList"]]) -> None: + """Create SSM parameter. + + Args: + ssm_client: Boto3 SSM client + name: SSM parameter name + value: SSM parameter value + parameter_type: SSM parameter type + """ + response = ssm_client.put_parameter(Name=name, Value=value, Type=parameter_type, Overwrite=True) + LOGGER.debug({"API_Call": "ssm:PutParameter", "API_Response": response}) + + +def delete_ssm_parameters(ssm_client: SSMClient, names: list) -> None: + """Delete SSM parameters. + + Args: + ssm_client: Boto3 SSM client + names: SSM parameter names + """ + response = ssm_client.delete_parameters(Names=names) + LOGGER.debug({"API_Call": "ssm:DeleteParameters", "API_Response": response}) + + +def get_customer_control_tower_regions() -> list: # noqa: CCR001 + """Query 'AWSControlTowerBP-BASELINE-CLOUDWATCH' CloudFormation stack to identify customer regions. + + Returns: + Customer regions chosen in Control Tower + """ + paginator = CFN_CLIENT.get_paginator("list_stack_instances") + customer_regions = [] + aws_account = "" + all_regions_identified = False + for page in paginator.paginate(StackSetName="AWSControlTowerBP-BASELINE-CLOUDWATCH", PaginationConfig={"PageSize": CLOUDFORMATION_PAGE_SIZE}): + for instance in page["Summaries"]: + if not aws_account: + aws_account = instance["Account"] + customer_regions.append(instance["Region"]) + continue + if aws_account == instance["Account"]: + customer_regions.append(instance["Region"]) + continue + all_regions_identified = True + break + if all_regions_identified: + break + sleep(CLOUDFORMATION_THROTTLE_PERIOD) + + return customer_regions + + +def get_enabled_regions() -> list: # noqa: CCR001 + """Query STS to identify enabled regions. + + Raises: + EndpointConnectionError: region is not valid. + + Returns: + Enabled regions + """ + # available_regions = management_account_session.get_available_regions("sts") # noqa: E800 + default_available_regions = [ + "eu-central-1", + "ap-northeast-1", + "sa-east-1", + "ap-southeast-1", + "us-east-1", + "us-east-2", + "ca-central-1", + "us-west-2", + "us-west-1", + "ap-northeast-3", + "ap-northeast-2", + "ap-south-1", + "eu-west-2", + "eu-north-1", + "eu-west-1", + "ap-southeast-2", + "eu-west-3", + ] + LOGGER.info({"Default_Available_Regions": default_available_regions}) + + enabled_regions = [] + disabled_regions = [] + region_session = boto3.Session() + for region in default_available_regions: + try: + sts_client = region_session.client("sts", endpoint_url=f"https://sts.{region}.amazonaws.com", region_name=region) + sts_client.get_caller_identity() + enabled_regions.append(region) + except EndpointConnectionError: + LOGGER.error(f"Region: '{region}' is not valid.") + raise + except ClientError as error: + if error.response["Error"]["Code"] == "InvalidClientTokenId": + disabled_regions.append(region) + continue + raise + + LOGGER.info({"Disabled_Regions": disabled_regions}) + return enabled_regions + + +def get_org_ssm_parameter_info(path: str) -> dict: + """Query AWS Organizations, and get info needed to create the SSM parameters. + + Args: + path: SSM parameter hierarchy path + + Returns: + Info needed to create SSM parameters and helper data for custom resource + """ + ssm_data: dict = {"info": []} + org = ORG_CLIENT.describe_organization()["Organization"] + root_id = ORG_CLIENT.list_roots()["Roots"][0]["Id"] + + ssm_data["info"].append({"name": f"{path}/root-organizational-unit-id", "value": root_id, "parameter_type": "String"}) + ssm_data["info"].append({"name": f"{path}/organization-id", "value": org["Id"], "parameter_type": "String"}) + ssm_data["info"].append({"name": f"{path}/management-account-id", "value": org["MasterAccountId"], "parameter_type": "String"}) + ssm_data["helper"] = {"ManagementAccountId": org["MasterAccountId"], "OrganizationId": org["Id"], "RootOrganizationalUnitId": root_id} + LOGGER.info(ssm_data["helper"]) + return ssm_data + + +def get_cloudformation_ssm_parameter_info(path: str) -> dict: # noqa: CCR001 + """Query AWS CloudFormation stacksets, and get info needed to create the SSM parameters. + + Args: + path: SSM parameter hierarchy path + + Returns: + Info needed to create SSM parameters and helper data for custom resource + """ + ssm_data: dict = {"info": [], "helper": {}} + response = CFN_CLIENT.describe_stack_set(StackSetName="AWSControlTowerBP-BASELINE-CONFIG") + for parameter in response["StackSet"]["Parameters"]: + if parameter["ParameterKey"] == "HomeRegionName": + ssm_data["info"].append({"name": f"{path}/home-region", "value": parameter["ParameterValue"], "parameter_type": "String"}) + ssm_data["helper"]["HomeRegion"] = parameter["ParameterValue"] + if parameter["ParameterKey"] == "SecurityAccountId": + ssm_data["info"].append({"name": f"{path}/audit-account-id", "value": parameter["ParameterValue"], "parameter_type": "String"}) + ssm_data["helper"]["AuditAccountId"] = parameter["ParameterValue"] + + paginator = CFN_CLIENT.get_paginator("list_stack_instances") + for page in paginator.paginate(StackSetName="AWSControlTowerLoggingResources", PaginationConfig={"PageSize": CLOUDFORMATION_PAGE_SIZE}): + for instance in page["Summaries"]: + ssm_data["info"].append({"name": f"{path}/log-archive-account-id", "value": instance["Account"], "parameter_type": "String"}) + ssm_data["helper"]["LogArchiveAccountId"] = instance["Account"] + sleep(CLOUDFORMATION_THROTTLE_PERIOD) + + LOGGER.info(ssm_data["helper"]) + return ssm_data + + +def get_enabled_regions_ssm_parameter_info(home_region: str, path: str) -> dict: # noqa: CCR001 + """Query STS for enabled regions, and get info needed to create the SSM parameters. + + Args: + home_region: Control Tower home region + path: SSM parameter hierarchy path + + Returns: + Info needed to create SSM parameters and helper data for custom resource + """ + ssm_data: dict = {"info": []} + enabled_regions = get_enabled_regions() + enabled_regions_without_home_region = enabled_regions.copy() + enabled_regions_without_home_region.remove(home_region) + + ssm_data["info"].append({"name": f"{path}/enabled-regions", "value": ",".join(enabled_regions), "parameter_type": "StringList"}) + ssm_data["info"].append( + { + "name": f"{path}/enabled-regions-without-home-region", + "value": ",".join(enabled_regions_without_home_region), + "parameter_type": "StringList", + } + ) + + ssm_data["helper"] = {"EnabledRegions": enabled_regions, "EnabledRegionsWithoutHomeRegion": enabled_regions_without_home_region} + LOGGER.info(ssm_data["helper"]) + return ssm_data + + +def get_customer_control_tower_regions_ssm_parameter_info(home_region: str, path: str) -> dict: + """Query customer regions chosen in Control Tower, and get info needed to create the SSM parameters. + + Args: + home_region: Control Tower home region + path: SSM parameter hierarchy path + + Returns: + Info needed to create SSM parameters and helper data for custom resource + """ + ssm_data: dict = {"info": []} + customer_regions = get_customer_control_tower_regions() + customer_regions_without_home_region = customer_regions.copy() + customer_regions_without_home_region.remove(home_region) + + ssm_data["info"].append({"name": f"{path}/customer-control-tower-regions", "value": ",".join(customer_regions), "parameter_type": "StringList"}) + ssm_data["info"].append( + { + "name": f"{path}/customer-control-tower-regions-without-home-region", + "value": ",".join(customer_regions_without_home_region), + "parameter_type": "StringList", + } + ) + + ssm_data["helper"] = { + "CustomerControlTowerRegions": customer_regions, + "CustomerControlTowerRegionsWithoutHomeRegion": customer_regions_without_home_region, + } + LOGGER.info(ssm_data["helper"]) + return ssm_data + + +def create_ssm_parameters_in_regions(ssm_parameters: list, tags: Sequence[TagTypeDef], regions: list) -> None: + """Create SSM parameters in regions. + + Args: + ssm_parameters: Info for the SSM parameters + tags: Tags to be applied to the SSM parameters + regions: Regions + """ + parameters_created = set() + for region in regions: + region_ssm_client: SSMClient = MANAGEMENT_ACCOUNT_SESSION.client("ssm", region_name=region) + for parameter in ssm_parameters: + create_ssm_parameter(region_ssm_client, name=parameter["name"], value=parameter["value"], parameter_type=parameter["parameter_type"]) + add_tags_to_ssm_parameter(region_ssm_client, resource_id=parameter["name"], tags=tags) + parameters_created.add(parameter["name"]) + + LOGGER.info(f"Completed the creation of SSM Parameters for '{region}' region.") + LOGGER.info({"Created Parameters": list(parameters_created)}) + + +def delete_ssm_parameters_in_regions(regions: list) -> None: # noqa: CCR001 + """Delete SSM parameters in regions. + + Args: + regions: Regions + """ + for region in regions: + region_ssm_client: SSMClient = MANAGEMENT_ACCOUNT_SESSION.client("ssm", region_name=region) + + parameters_to_delete = [] + count = 0 + for parameter in SRA_SSM_PARAMETERS: + count += 1 # noqa: SIM113 + if count <= SSM_DELETE_PARAMETERS_MAX: + parameters_to_delete.append(parameter) + if count == SSM_DELETE_PARAMETERS_MAX: + count = 0 + delete_ssm_parameters(region_ssm_client, parameters_to_delete) + parameters_to_delete = [] + if parameters_to_delete: + delete_ssm_parameters(region_ssm_client, parameters_to_delete) + + LOGGER.info(f"Completed the deletion of SSM Parameters for '{region}' region.") + LOGGER.info({"Deleted Parameters": SRA_SSM_PARAMETERS}) + + +def parameter_pattern_validator(parameter_name: str, parameter_value: Union[str, None], pattern: str) -> None: + """Validate CloudFormation Custom Resource Parameters. + + Args: + parameter_name: CloudFormation custom resource parameter name + parameter_value: CloudFormation custom resource parameter value + pattern: REGEX pattern to validate against. + + Raises: + ValueError: Parameter is missing + ValueError: Parameter does not follow the allowed pattern + """ + if not parameter_value: + raise ValueError(f"'{parameter_name}' parameter is missing.") + elif not re.match(pattern, parameter_value): + raise ValueError(f"'{parameter_name}' parameter with value of '{parameter_value}' does not follow the allowed pattern: {pattern}.") + + +def get_validated_parameters() -> dict: + """Validate AWS CloudFormation parameters. + + Returns: + Validated parameters + """ + tag_key = os.getenv("TAG_KEY", "sra-solution") + tag_value = os.getenv("TAG_VALUE", "sra-common-prerequisites") + + parameter_pattern_validator("TAG_KEY", tag_key, pattern=r"^.{1,128}$") + parameter_pattern_validator("TAG_VALUE", tag_value, pattern=r"^.{1,256}$") + + return {"TAG_KEY": tag_key, "TAG_VALUE": tag_value} + + +@helper.create +@helper.update +def create_update_event(event: CloudFormationCustomResourceEvent, context: Context) -> str: # noqa: U100 + """Create/Update Event from AWS CloudFormation. + + Args: + event: event data + context: runtime information + + Returns: + AWS CloudFormation physical resource id + """ + event_info = {"Event": event} + LOGGER.info(event_info) + + params = get_validated_parameters() + tags: Sequence[TagTypeDef] = [{"Key": params["TAG_KEY"], "Value": params["TAG_VALUE"]}] + + ssm_data1 = get_org_ssm_parameter_info(path=SRA_CONTROL_TOWER_SSM_PATH) + ssm_data2 = get_cloudformation_ssm_parameter_info(path=SRA_CONTROL_TOWER_SSM_PATH) + ssm_data3 = get_customer_control_tower_regions_ssm_parameter_info(ssm_data2["helper"]["HomeRegion"], path=SRA_REGIONS_SSM_PATH) + ssm_data4 = get_enabled_regions_ssm_parameter_info(ssm_data2["helper"]["HomeRegion"], path=SRA_REGIONS_SSM_PATH) + + ssm_parameters = ssm_data1["info"] + ssm_data2["info"] + ssm_data3["info"] + ssm_data4["info"] + create_ssm_parameters_in_regions(ssm_parameters, tags, ssm_data4["helper"]["EnabledRegions"]) + + helper.Data = ssm_data1["helper"] | ssm_data2["helper"] | ssm_data3["helper"] | ssm_data4["helper"] + return "MANAGEMENT-ACCOUNT-PARAMETERS" + + +@helper.delete +def delete_event(event: CloudFormationCustomResourceEvent, context: Context) -> None: # noqa: U100 + """Delete Event from AWS CloudFormation. + + Args: + event: event data + context: runtime information + """ + event_info = {"Event": event} + LOGGER.info(event_info) + LOGGER.info("SRA SSM Parameters are being retained.") + # delete_ssm_parameters_in_regions(get_enabled_regions()) # noqa: E800 + + +def lambda_handler(event: CloudFormationCustomResourceEvent, context: Context) -> None: + """Lambda Handler. + + Args: + event: event data + context: runtime information + + Raises: + ValueError: Unexpected error executing Lambda function + """ + LOGGER.info("....Lambda Handler Started....") + try: + event_info = {"Event": event} + LOGGER.info(event_info) + helper(event, context) + except Exception as error: + LOGGER.error({"Unexpected Error": error}) + raise ValueError(f"See the details in CloudWatch Log Stream: '{context.log_group_name}'") from None diff --git a/aws_sra_examples/solutions/common/common_prerequisites/lambda/src/inline_lambda.py b/aws_sra_examples/solutions/common/common_prerequisites/lambda/src/inline_lambda.py new file mode 100644 index 00000000..50e5ddb5 --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/lambda/src/inline_lambda.py @@ -0,0 +1,47 @@ +# type: ignore +"""Custom Resource to get AWS Organization ID. +Version: 1.0 + +'common_prerequisites' solution in the repo, https://github.com/aws-samples/aws-security-reference-architecture-examples + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: MIT-0 +""" +import logging +import os + +import boto3 +import cfnresponse + +LOGGER = logging.getLogger(__name__) +log_level = os.environ.get("LOG_LEVEL", logging.ERROR) +LOGGER.setLevel(log_level) + + +def get_org_id(): + """Get AWS Organization ID. + + Returns: + Response data for custom resource + """ + management_account_session = boto3.Session() + org_client = management_account_session.client("organizations") + response = org_client.describe_organization()["Organization"] + LOGGER.debug({"API_Call": "organizations:DescribeOrganization", "API_Response": response}) + return {"OrganizationId": response["Id"]} + + +def lambda_handler(event, context): + """Lambda Handler. + + Args: + event: event data + context: runtime information + """ + try: + data = get_org_id() + cfnresponse.send(event, context, cfnresponse.SUCCESS, data, data["OrganizationId"]) + except Exception as error: + LOGGER.error({"Unexpected Error": error}) + reason = f"See the details in CloudWatch Log Stream: '{context.log_group_name}'" + cfnresponse.send(event, context, cfnresponse.FAILED, {}, data["OrganizationId"], reason=reason) diff --git a/aws_sra_examples/solutions/common/common_prerequisites/lambda/src/requirements.txt b/aws_sra_examples/solutions/common/common_prerequisites/lambda/src/requirements.txt new file mode 100644 index 00000000..a674f2c6 --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/lambda/src/requirements.txt @@ -0,0 +1,2 @@ +# install latest +crhelper diff --git a/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-control-tower-execution-role.yaml b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-control-tower-execution-role.yaml new file mode 100644 index 00000000..690c1bf7 --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-control-tower-execution-role.yaml @@ -0,0 +1,102 @@ +######################################################################## +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +######################################################################## +AWSTemplateFormatVersion: 2010-09-09 +Description: + AWS Control Tower Execution IAM Role Creation. - 'common_prerequisites' solution in the repo, + https://github.com/aws-samples/aws-security-reference-architecture-examples +Metadata: + SRA: + Version: '1.0' + Order: '1' + + AWS::CloudFormation::Interface: + ParameterGroups: + - Label: + default: General Properties + Parameters: + - pSRASolutionTagKey + - pSRASolutionName + - pManagementAccountId + - Label: + default: Control Tower Role Attributes + Parameters: + - pCreateAWSControlTowerExecutionRole + - pAWSControlTowerExecutionRoleName + ParameterLabels: + pAWSControlTowerExecutionRoleName: + default: AWS Control Tower Execution Role Name + pCreateAWSControlTowerExecutionRole: + default: Create AWS Control Tower Execution Role + pManagementAccountId: + default: Management Account ID + pSRASolutionName: + default: SRA Solution Name + pSRASolutionTagKey: + default: SRA Solution Tag Key + +Parameters: + pAWSControlTowerExecutionRoleName: + AllowedValues: [AWSControlTowerExecution] + Default: AWSControlTowerExecution + Description: AWS Control Tower execution role name + Type: String + pCreateAWSControlTowerExecutionRole: + AllowedValues: ['true', 'false'] + Default: 'true' + Description: Indicates whether the AWS Control Tower Execution role should be created. + Type: String + pManagementAccountId: + AllowedPattern: '^\d{12}$' + ConstraintDescription: Must be 12 digits. + Description: AWS Account ID of the Control Tower Management account. + Type: String + pSRASolutionName: + AllowedValues: [sra-common-prerequisites] + Default: sra-common-prerequisites + Description: The SRA solution name. The default value is the folder name of the solution + Type: String + pSRASolutionTagKey: + AllowedValues: [sra-solution] + Default: sra-solution + Description: The SRA solution tag key applied to all resources created by the solution that support tagging. The value is the pSRASolutionName. + Type: String + +Conditions: + cCreateAWSControlTowerExecutionRole: !Equals [!Ref pCreateAWSControlTowerExecutionRole, 'true'] + +Resources: + rAWSControlTowerRole: + Condition: cCreateAWSControlTowerExecutionRole + # DeletionPolicy: Retain + # UpdateReplacePolicy: Retain + Type: AWS::IAM::Role + Metadata: + cfn_nag: + rules_to_suppress: + - id: W28 + reason: Specific role name provided for AWS Control Tower + - id: W43 + reason: Administrator policy is required for the role + Properties: + RoleName: !Ref pAWSControlTowerExecutionRoleName + AssumeRolePolicyDocument: + Version: 2012-10-17 + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + AWS: + - !Sub arn:${AWS::Partition}:iam::${pManagementAccountId}:root + ManagedPolicyArns: + - !Sub arn:${AWS::Partition}:iam::aws:policy/AdministratorAccess + Tags: + - Key: !Ref pSRASolutionTagKey + Value: !Ref pSRASolutionName + +Outputs: + oAWSControlTowerExecutionRoleArn: + Condition: cCreateAWSControlTowerExecutionRole + Description: AWS Control Tower Execution Role ARN + Value: !Ref rAWSControlTowerRole diff --git a/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-main-ssm.yaml b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-main-ssm.yaml new file mode 100644 index 00000000..1dfb81da --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-main-ssm.yaml @@ -0,0 +1,357 @@ +######################################################################## +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +######################################################################## +AWSTemplateFormatVersion: 2010-09-09 +Description: + This template creates the pre-requisite resources for staging the SRA solutions. Resolving SSM parameters. - 'common_prerequisites' solution in the + repo, https://github.com/aws-samples/aws-security-reference-architecture-examples +Metadata: + SRA: + Version: '1.0' + Order: '1' + + AWS::CloudFormation::Interface: + ParameterGroups: + - Label: + default: General Properties + Parameters: + - pSRASolutionName + - pSRAStagingS3BucketNamePrefix + - pCreateSRAStagingS3BucketInMemberAccounts + - pCreateSSMParametersInMemberAccounts + - Label: + default: Control Tower Properties + Parameters: + - pAuditAccountId + - pLogArchiveAccountId + - pManagementAccountId + - pRootOrganizationalUnitId + - pOrganizationId + - pHomeRegion + - Label: + Description: Region Properties + Parameters: + - pCustomerControlTowerRegions + - pCustomerControlTowerRegionsWithoutHomeRegion + - pEnabledRegions + - pEnabledRegionsWithoutHomeRegion + - Label: + default: Control Tower Role Properties + Parameters: + - pCreateAWSControlTowerExecutionRole + - Label: + default: General Lambda Function Properties + Parameters: + - pCreateLambdaLogGroup + - pLambdaLogGroupRetention + - pLambdaLogGroupKmsKey + - pLambdaLogLevel + + ParameterLabels: + pAuditAccountId: + default: Audit Account ID + pCreateAWSControlTowerExecutionRole: + default: Create AWS Control Tower Execution Role + pCreateLambdaLogGroup: + default: Create Lambda Log Group + pCreateSRAStagingS3BucketInMemberAccounts: + default: Create SRA Staging S3 Bucket in Member Accounts + pCreateSSMParametersInMemberAccounts: + default: Create SSM Parameters in Member Accounts + pCustomerControlTowerRegions: + default: CustomerControlTowerRegions + pCustomerControlTowerRegionsWithoutHomeRegion: + default: CustomerControlTowerRegions without Home Region + pEnabledRegions: + default: Enabled Regions + pEnabledRegionsWithoutHomeRegion: + default: Enabled Regions without Home Region + pHomeRegion: + default: Control Tower Home Region + pLambdaLogGroupKmsKey: + default: (Optional) Lambda Logs KMS Key + pLambdaLogGroupRetention: + default: Lambda Log Group Retention + pLambdaLogLevel: + default: Lambda Log Level + pLogArchiveAccountId: + default: Log Archive Account ID + pManagementAccountId: + default: Management Account ID + pOrganizationId: + default: Organization ID + pRootOrganizationalUnitId: + default: Root Organizational Unit ID + pSRASolutionName: + default: SRA Solution Name + pSRAStagingS3BucketNamePrefix: + default: SRA Staging S3 Bucket Name Prefix + +Parameters: + pAuditAccountId: + AllowedPattern: '^([\w.-]{1,900})$|^(\/[\w.-]{1,900})*[\w.-]{1,900}$' + ConstraintDescription: + Must be alphanumeric or special characters [., _, -]. In addition, the slash character ( / ) used to delineate hierarchies in parameter names. + Default: /sra/control-tower/audit-account-id + Description: SSM Parameter for AWS Account ID of the Control Tower Audit account. + Type: AWS::SSM::Parameter::Value + pCreateAWSControlTowerExecutionRole: + AllowedValues: ['true', 'false'] + Default: 'true' + Description: Indicates whether the AWS Control Tower Execution role should be created. + Type: String + pCreateLambdaLogGroup: + AllowedValues: ['true', 'false'] + Default: 'false' + Description: + Indicates whether a CloudWatch Log Group should be explicitly created for the Lambda function, to allow for setting a Log Retention and/or KMS + Key for encryption. + Type: String + pCreateSRAStagingS3BucketInMemberAccounts: + AllowedValues: ['true', 'false'] + Default: 'false' + Description: Indicates whether the SRA Staging S3 Bucket should be created in all member accounts. + Type: String + pCreateSSMParametersInMemberAccounts: + AllowedValues: ['true', 'false'] + Default: 'true' + Description: Indicates whether the SSM Parameters should be created in all member accounts. + Type: String + pCustomerControlTowerRegions: + AllowedPattern: '^([\w.-]{1,900})$|^(\/[\w.-]{1,900})*[\w.-]{1,900}$' + ConstraintDescription: + Must be alphanumeric or special characters [., _, -]. In addition, the slash character ( / ) used to delineate hierarchies in parameter names. + Default: /sra/regions/customer-control-tower-regions + Description: SSM Parameter for Customer Control Tower regions + Type: AWS::SSM::Parameter::Value> + pCustomerControlTowerRegionsWithoutHomeRegion: + AllowedPattern: '^([\w.-]{1,900})$|^(\/[\w.-]{1,900})*[\w.-]{1,900}$' + ConstraintDescription: + Must be alphanumeric or special characters [., _, -]. In addition, the slash character ( / ) used to delineate hierarchies in parameter names. + Default: /sra/regions/customer-control-tower-regions-without-home-region + Description: SSM Parameter for Customer Control Tower regions without Home Region + Type: AWS::SSM::Parameter::Value> + pEnabledRegions: + AllowedPattern: '^([\w.-]{1,900})$|^(\/[\w.-]{1,900})*[\w.-]{1,900}$' + ConstraintDescription: + Must be alphanumeric or special characters [., _, -]. In addition, the slash character ( / ) used to delineate hierarchies in parameter names. + Default: /sra/regions/enabled-regions + Description: SSM Parameter for Enabled regions + Type: AWS::SSM::Parameter::Value> + pEnabledRegionsWithoutHomeRegion: + AllowedPattern: '^([\w.-]{1,900})$|^(\/[\w.-]{1,900})*[\w.-]{1,900}$' + ConstraintDescription: + Must be alphanumeric or special characters [., _, -]. In addition, the slash character ( / ) used to delineate hierarchies in parameter names. + Default: /sra/regions/enabled-regions-without-home-region + Description: SSM Parameter for Enabled regions without Home Region + Type: AWS::SSM::Parameter::Value> + pHomeRegion: + AllowedPattern: '^([\w.-]{1,900})$|^(\/[\w.-]{1,900})*[\w.-]{1,900}$' + ConstraintDescription: + Must be alphanumeric or special characters [., _, -]. In addition, the slash character ( / ) used to delineate hierarchies in parameter names. + Default: /sra/control-tower/home-region + Description: SSM Parameter for Name of the Control Tower home region + Type: AWS::SSM::Parameter::Value + pLambdaLogGroupKmsKey: + AllowedPattern: '^$|^arn:(aws[a-zA-Z-]*){1}:kms:[a-z0-9-]+:\d{12}:key\/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$' + ConstraintDescription: 'Key ARN example: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' + Description: + (Optional) KMS Key ARN to use for encrypting the Lambda logs data. If empty, encryption is enabled with CloudWatch Logs managing the server-side + encryption keys. + Type: String + pLambdaLogGroupRetention: + AllowedValues: [1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653] + Default: 14 + Description: Specifies the number of days you want to retain log events + Type: String + pLambdaLogLevel: + AllowedValues: [INFO, ERROR, DEBUG] + Default: INFO + Description: Lambda Function Logging Level + Type: String + pLogArchiveAccountId: + AllowedPattern: '^([\w.-]{1,900})$|^(\/[\w.-]{1,900})*[\w.-]{1,900}$' + ConstraintDescription: + Must be alphanumeric or special characters [., _, -]. In addition, the slash character ( / ) used to delineate hierarchies in parameter names. + Default: /sra/control-tower/log-archive-account-id + Description: SSM Parameter for AWS Account ID of the Control Tower Log Archive account. + Type: AWS::SSM::Parameter::Value + pManagementAccountId: + AllowedPattern: '^([\w.-]{1,900})$|^(\/[\w.-]{1,900})*[\w.-]{1,900}$' + ConstraintDescription: + Must be alphanumeric or special characters [., _, -]. In addition, the slash character ( / ) used to delineate hierarchies in parameter names. + Default: /sra/control-tower/management-account-id + Description: SSM Parameter for AWS Account ID of the Control Tower Management account. + Type: AWS::SSM::Parameter::Value + pOrganizationId: + AllowedPattern: '^([\w.-]{1,900})$|^(\/[\w.-]{1,900})*[\w.-]{1,900}$' + ConstraintDescription: + Must be alphanumeric or special characters [., _, -]. In addition, the slash character ( / ) used to delineate hierarchies in parameter names. + Default: /sra/control-tower/organization-id + Description: SSM Parameter for AWS Organizations ID + Type: AWS::SSM::Parameter::Value + pRootOrganizationalUnitId: + AllowedPattern: '^([\w.-]{1,900})$|^(\/[\w.-]{1,900})*[\w.-]{1,900}$' + ConstraintDescription: + Must be alphanumeric or special characters [., _, -]. In addition, the slash character ( / ) used to delineate hierarchies in parameter names. + Default: /sra/control-tower/root-organizational-unit-id + Description: SSM Parameter for Root Organizational Unit ID + Type: AWS::SSM::Parameter::Value + pSRASolutionName: + AllowedValues: [sra-common-prerequisites] + Default: sra-common-prerequisites + Description: The SRA solution name. The Description value is the folder name of the solution + Type: String + pSRAStagingS3BucketNamePrefix: + AllowedValues: [sra-staging] + Default: sra-staging + Description: + SRA Staging S3 bucket name prefix for the SRA artifacts relevant to the solutions. (e.g., lambda zips, CloudFormation templates). The account + and region are added to the prefix --. Example = sra-staging-123456789012-us-east-1. + Type: String + +Conditions: + cCreateSRAStagingS3BucketInMemberAccounts: !Equals [!Ref pCreateSRAStagingS3BucketInMemberAccounts, 'true'] + cCreateSSMParametersInMemberAccounts: !Equals [!Ref pCreateSSMParametersInMemberAccounts, 'true'] + +Resources: + rControlTowerExecutionRoleStack: + Type: AWS::CloudFormation::Stack + Properties: + TemplateURL: !Sub + - https://${SRAStagingS3BucketName}.s3.${AWS::Region}.${AWS::URLSuffix}/${pSRASolutionName}/templates/sra-common-prerequisites-control-tower-execution-role.yaml + - SRAStagingS3BucketName: !Sub ${pSRAStagingS3BucketNamePrefix}-${AWS::AccountId}-${AWS::Region} + Tags: + - Key: sra-solution + Value: !Ref pSRASolutionName + Parameters: + pCreateAWSControlTowerExecutionRole: !Ref pCreateAWSControlTowerExecutionRole + pManagementAccountId: !Ref pManagementAccountId + + rSSMParametersMemberAccountsStackSet: + Condition: cCreateSSMParametersInMemberAccounts + DependsOn: rControlTowerExecutionRoleStack + Type: AWS::CloudFormation::StackSet + Properties: + StackSetName: sra-member-account-parameters + AutoDeployment: + Enabled: true + RetainStacksOnAccountRemoval: false + CallAs: SELF + Description: Deploys SSM Parameters + OperationPreferences: + FailureTolerancePercentage: 0 + MaxConcurrentPercentage: 100 + RegionConcurrencyType: PARALLEL + PermissionModel: SERVICE_MANAGED + StackInstancesGroup: + - DeploymentTargets: + OrganizationalUnitIds: + - !Ref pRootOrganizationalUnitId + Regions: !Ref pCustomerControlTowerRegions + TemplateURL: !Sub + - https://${SRAStagingS3BucketName}.s3.${AWS::Region}.${AWS::URLSuffix}/${pSRASolutionName}/templates/sra-common-prerequisites-member-account-parameters.yaml + - SRAStagingS3BucketName: !Sub ${pSRAStagingS3BucketNamePrefix}-${AWS::AccountId}-${AWS::Region} + Tags: + - Key: sra-solution + Value: !Ref pSRASolutionName + Parameters: + - ParameterKey: pAuditAccountId + ParameterValue: !Ref pAuditAccountId + - ParameterKey: pCustomerControlTowerRegions + ParameterValue: !Join [',', !Ref pCustomerControlTowerRegions] + - ParameterKey: pCustomerControlTowerRegionsWithoutHomeRegion + ParameterValue: !Join [',', !Ref pCustomerControlTowerRegionsWithoutHomeRegion] + - ParameterKey: pEnabledRegions + ParameterValue: !Join [',', !Ref pEnabledRegions] + - ParameterKey: pEnabledRegionsWithoutHomeRegion + ParameterValue: !Join [',', !Ref pEnabledRegionsWithoutHomeRegion] + - ParameterKey: pHomeRegion + ParameterValue: !Ref pHomeRegion + - ParameterKey: pLogArchiveAccountId + ParameterValue: !Ref pLogArchiveAccountId + - ParameterKey: pManagementAccountId + ParameterValue: !Ref pManagementAccountId + - ParameterKey: pOrganizationId + ParameterValue: !Ref pOrganizationId + - ParameterKey: pRootOrganizationalUnitId + ParameterValue: !Ref pRootOrganizationalUnitId + + rStagingS3BucketManagementAccountStackSet: + DependsOn: rControlTowerExecutionRoleStack + Type: AWS::CloudFormation::StackSet + Properties: + StackSetName: sra-staging-s3-bucket-management-account-regions + AdministrationRoleARN: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/service-role/AWSControlTowerStackSetRole + CallAs: SELF + Capabilities: + - CAPABILITY_NAMED_IAM + Description: Deploys an SRA Staging S3 Bucket + ExecutionRoleName: AWSControlTowerExecution + OperationPreferences: + FailureTolerancePercentage: 0 + MaxConcurrentPercentage: 100 + RegionConcurrencyType: PARALLEL + PermissionModel: SELF_MANAGED + StackInstancesGroup: + - DeploymentTargets: + Accounts: + - !Ref AWS::AccountId + Regions: !Ref pCustomerControlTowerRegionsWithoutHomeRegion + TemplateURL: !Sub + - https://${SRAStagingS3BucketName}.s3.${AWS::Region}.${AWS::URLSuffix}/${pSRASolutionName}/templates/sra-common-prerequisites-staging-s3-bucket.yaml + - SRAStagingS3BucketName: !Sub ${pSRAStagingS3BucketNamePrefix}-${AWS::AccountId}-${AWS::Region} + Parameters: + - ParameterKey: pCreateLambdaLogGroup + ParameterValue: !Ref pCreateLambdaLogGroup + - ParameterKey: pLambdaLogGroupKmsKey + ParameterValue: !Ref pLambdaLogGroupKmsKey + - ParameterKey: pLambdaLogGroupRetention + ParameterValue: !Ref pLambdaLogGroupRetention + - ParameterKey: pLambdaLogLevel + ParameterValue: !Ref pLambdaLogLevel + - ParameterKey: pOrganizationId + ParameterValue: !Ref pOrganizationId + - ParameterKey: pSRASolutionName + ParameterValue: !Ref pSRASolutionName + + rStagingS3BucketMemberAccountsStackSet: + Condition: cCreateSRAStagingS3BucketInMemberAccounts + DependsOn: rControlTowerExecutionRoleStack + Type: AWS::CloudFormation::StackSet + Properties: + StackSetName: sra-staging-s3-bucket-member-accounts + AutoDeployment: + Enabled: true + RetainStacksOnAccountRemoval: false + CallAs: SELF + Capabilities: + - CAPABILITY_NAMED_IAM + Description: Deploys an SRA Staging S3 Bucket + OperationPreferences: + FailureTolerancePercentage: 0 + MaxConcurrentPercentage: 100 + RegionConcurrencyType: PARALLEL + PermissionModel: SERVICE_MANAGED + StackInstancesGroup: + - DeploymentTargets: + OrganizationalUnitIds: + - !Ref pRootOrganizationalUnitId + Regions: !Ref pCustomerControlTowerRegions + TemplateURL: !Sub + - https://${SRAStagingS3BucketName}.s3.${AWS::Region}.${AWS::URLSuffix}/${pSRASolutionName}/templates/sra-common-prerequisites-staging-s3-bucket.yaml + - SRAStagingS3BucketName: !Sub ${pSRAStagingS3BucketNamePrefix}-${AWS::AccountId}-${AWS::Region} + Parameters: + - ParameterKey: pCreateLambdaLogGroup + ParameterValue: !Ref pCreateLambdaLogGroup + - ParameterKey: pLambdaLogGroupKmsKey + ParameterValue: !Ref pLambdaLogGroupKmsKey + - ParameterKey: pLambdaLogGroupRetention + ParameterValue: !Ref pLambdaLogGroupRetention + - ParameterKey: pLambdaLogLevel + ParameterValue: !Ref pLambdaLogLevel + - ParameterKey: pOrganizationId + ParameterValue: !Ref pOrganizationId + - ParameterKey: pSRASolutionName + ParameterValue: !Ref pSRASolutionName diff --git a/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-main.yaml b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-main.yaml new file mode 100644 index 00000000..fa507690 --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-main.yaml @@ -0,0 +1,341 @@ +######################################################################## +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +######################################################################## +AWSTemplateFormatVersion: 2010-09-09 +Description: + This template creates the pre-requisite resources for staging the SRA solutions. - 'common_prerequisites' solution in the repo, + https://github.com/aws-samples/aws-security-reference-architecture-examples +Metadata: + SRA: + Version: '1.0' + Order: '1' + + AWS::CloudFormation::Interface: + ParameterGroups: + - Label: + default: General Properties + Parameters: + - pSRASolutionName + - pSRAStagingS3BucketNamePrefix + - pCreateSRAStagingS3BucketInMemberAccounts + - pCreateSSMParametersInMemberAccounts + - Label: + default: Control Tower Properties + Parameters: + - pAuditAccountId + - pLogArchiveAccountId + - pManagementAccountId + - pRootOrganizationalUnitId + - pOrganizationId + - pHomeRegion + - Label: + Description: Region Properties + Parameters: + - pCustomerControlTowerRegions + - pCustomerControlTowerRegionsWithoutHomeRegion + - pEnabledRegions + - pEnabledRegionsWithoutHomeRegion + - Label: + default: Control Tower Role Properties + Parameters: + - pCreateAWSControlTowerExecutionRole + - Label: + default: General Lambda Function Properties + Parameters: + - pCreateLambdaLogGroup + - pLambdaLogGroupRetention + - pLambdaLogGroupKmsKey + - pLambdaLogLevel + + ParameterLabels: + pAuditAccountId: + default: Audit Account ID + pCreateAWSControlTowerExecutionRole: + default: Create AWS Control Tower Execution Role + pCreateLambdaLogGroup: + default: Create Lambda Log Group + pCreateSRAStagingS3BucketInMemberAccounts: + default: Create SRA Staging S3 Bucket in Member Accounts + pCreateSSMParametersInMemberAccounts: + default: Create SSM Parameters in Member Accounts + pCustomerControlTowerRegions: + default: Customer Control Tower Regions + pCustomerControlTowerRegionsWithoutHomeRegion: + default: Customer Control Tower Regions without Home Region + pEnabledRegions: + default: Enabled Regions + pEnabledRegionsWithoutHomeRegion: + default: Enabled Regions without Home Region + pHomeRegion: + default: Control Tower Home Region + pLambdaLogGroupRetention: + default: Lambda Log Group Retention + pLambdaLogGroupKmsKey: + default: (Optional) Lambda Logs KMS Key + pLambdaLogLevel: + default: Lambda Log Level + pLogArchiveAccountId: + default: Log Archive Account ID + pManagementAccountId: + default: Management Account ID + pOrganizationId: + default: Organization ID + pRootOrganizationalUnitId: + default: Root Organizational Unit ID + pSRASolutionName: + default: SRA Solution Name + pSRAStagingS3BucketNamePrefix: + default: SRA Staging S3 Bucket Name Prefix + +Parameters: + pAuditAccountId: + AllowedPattern: '^\d{12}$' + ConstraintDescription: Must be 12 digits. + Description: AWS Account ID of the Control Tower Audit account. + Type: String + pCreateAWSControlTowerExecutionRole: + AllowedValues: ['true', 'false'] + Default: 'true' + Description: Indicates whether the AWS Control Tower Execution role should be created. + Type: String + pCreateLambdaLogGroup: + AllowedValues: ['true', 'false'] + Default: 'false' + Description: + Indicates whether a CloudWatch Log Group should be explicitly created for the Lambda function, to allow for setting a Log Retention and/or KMS + Key for encryption. + Type: String + pCreateSRAStagingS3BucketInMemberAccounts: + AllowedValues: ['true', 'false'] + Default: 'false' + Description: Indicates whether the SRA Staging S3 Bucket should be created in all member accounts. + Type: String + pCreateSSMParametersInMemberAccounts: + AllowedValues: ['true', 'false'] + Default: 'true' + Description: Indicates whether the SSM Parameters should be created in all member accounts. + Type: String + pCustomerControlTowerRegions: + AllowedPattern: '^([a-z0-9-]{1,64})$|^(([a-z0-9-]{1,64},)*[a-z0-9-]{1,64})$' + ConstraintDescription: + Only lowercase letters, numbers, and hyphens ('-') allowed. (e.g. us-east-1) Additional AWS regions can be provided, separated by commas without + spaces. (e.g. us-east-1,ap-southeast-2) + Description: Customer Control Tower regions (2+ regions, separate by commas) + Type: String + pCustomerControlTowerRegionsWithoutHomeRegion: + AllowedPattern: '^([a-z0-9-]{1,64})$|^(([a-z0-9-]{1,64},)*[a-z0-9-]{1,64})$' + ConstraintDescription: + Only lowercase letters, numbers, and hyphens ('-') allowed. (e.g. us-east-1) Additional AWS regions can be provided, separated by commas without + spaces. (e.g. us-east-1,ap-southeast-2) + Description: Customer Control Tower regions without Home Region (2+ regions, separate by commas) + Type: String + pEnabledRegions: + AllowedPattern: '^([a-z0-9-]{1,64})$|^(([a-z0-9-]{1,64},)*[a-z0-9-]{1,64})$' + ConstraintDescription: + Only lowercase letters, numbers, and hyphens ('-') allowed. (e.g. us-east-1) Additional AWS regions can be provided, separated by commas without + spaces. (e.g. us-east-1,ap-southeast-2) + Description: Enabled regions (2+ regions, separate by commas) + Type: String + pEnabledRegionsWithoutHomeRegion: + AllowedPattern: '^([a-z0-9-]{1,64})$|^(([a-z0-9-]{1,64},)*[a-z0-9-]{1,64})$' + ConstraintDescription: + Only lowercase letters, numbers, and hyphens ('-') allowed. (e.g. us-east-1) Additional AWS regions can be provided, separated by commas without + spaces. (e.g. us-east-1,ap-southeast-2) + Description: Enabled regions without Home Region (2+ regions, separate by commas) + Type: String + pHomeRegion: + AllowedPattern: '^[a-z0-9-]{1,64}$' + ConstraintDescription: AWS Region Example - 'us-east-1' + Description: Name of the Control Tower home region + Type: String + pLambdaLogGroupKmsKey: + AllowedPattern: '^$|^arn:(aws[a-zA-Z-]*){1}:kms:[a-z0-9-]+:\d{12}:key\/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$' + ConstraintDescription: 'Key ARN example: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' + Description: + (Optional) KMS Key ARN to use for encrypting the Lambda logs data. If empty, encryption is enabled with CloudWatch Logs managing the server-side + encryption keys. + Type: String + pLambdaLogGroupRetention: + AllowedValues: [1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653] + Default: 14 + Description: Specifies the number of days you want to retain log events + Type: String + pLambdaLogLevel: + AllowedValues: [INFO, ERROR, DEBUG] + Default: INFO + Description: Lambda Function Logging Level + Type: String + pLogArchiveAccountId: + AllowedPattern: '^\d{12}$' + ConstraintDescription: Must be 12 digits. + Description: AWS Account ID of the Control Tower Log Archive account. + Type: String + pManagementAccountId: + AllowedPattern: '^\d{12}$' + ConstraintDescription: Must be 12 digits. + Description: AWS Account ID of the Control Tower Management account. + Type: String + pOrganizationId: + AllowedPattern: '^o-[a-z0-9]{10,32}$' + ConstraintDescription: Must start with 'o-' followed by from 10 to 32 lowercase letters or digits. (e.g. o-abc1234567) + Description: AWS Organizations ID + Type: String + pRootOrganizationalUnitId: + AllowedPattern: '^r-[0-9a-z]{4,32}$' + ConstraintDescription: Must start with 'r-' followed by from 4 to 32 lowercase letters or digits. (e.g. r-abc123) + Description: Root Organizational Unit ID + Type: String + pSRASolutionName: + AllowedValues: [sra-common-prerequisites] + Default: sra-common-prerequisites + Description: The SRA solution name. The Description value is the folder name of the solution + Type: String + pSRAStagingS3BucketNamePrefix: + AllowedValues: [sra-staging] + Default: sra-staging + Description: + SRA Staging S3 bucket name prefix for the SRA artifacts relevant to the solutions. (e.g., lambda zips, CloudFormation templates). The account + and region are added to the prefix --. Example = sra-staging-123456789012-us-east-1. + Type: String + +Conditions: + cCreateSRAStagingS3BucketInMemberAccounts: !Equals [!Ref pCreateSRAStagingS3BucketInMemberAccounts, 'true'] + cCreateSSMParametersInMemberAccounts: !Equals [!Ref pCreateSSMParametersInMemberAccounts, 'true'] + +Resources: + rControlTowerExecutionRoleStack: + Type: AWS::CloudFormation::Stack + Properties: + TemplateURL: !Sub + - https://${SRAStagingS3BucketName}.s3.${AWS::Region}.${AWS::URLSuffix}/${pSRASolutionName}/templates/sra-common-prerequisites-control-tower-execution-role.yaml + - SRAStagingS3BucketName: !Sub ${pSRAStagingS3BucketNamePrefix}-${AWS::AccountId}-${AWS::Region} + Tags: + - Key: sra-solution + Value: !Ref pSRASolutionName + Parameters: + pCreateAWSControlTowerExecutionRole: !Ref pCreateAWSControlTowerExecutionRole + pManagementAccountId: !Ref pManagementAccountId + + rSSMParametersMemberAccountsStackSet: + Condition: cCreateSSMParametersInMemberAccounts + DependsOn: rControlTowerExecutionRoleStack + Type: AWS::CloudFormation::StackSet + Properties: + StackSetName: sra-member-account-parameters + AutoDeployment: + Enabled: true + RetainStacksOnAccountRemoval: false + CallAs: SELF + Description: Deploys SSM Parameters + OperationPreferences: + FailureTolerancePercentage: 0 + MaxConcurrentPercentage: 100 + RegionConcurrencyType: PARALLEL + PermissionModel: SERVICE_MANAGED + StackInstancesGroup: + - DeploymentTargets: + OrganizationalUnitIds: + - !Ref pRootOrganizationalUnitId + Regions: !Split [',', !Ref pCustomerControlTowerRegions] + TemplateURL: !Sub + - https://${SRAStagingS3BucketName}.s3.${AWS::Region}.${AWS::URLSuffix}/${pSRASolutionName}/templates/sra-common-prerequisites-member-account-parameters.yaml + - SRAStagingS3BucketName: !Sub ${pSRAStagingS3BucketNamePrefix}-${AWS::AccountId}-${AWS::Region} + Tags: + - Key: sra-solution + Value: !Ref pSRASolutionName + Parameters: + - ParameterKey: pAuditAccountId + ParameterValue: !Ref pAuditAccountId + - ParameterKey: pCustomerControlTowerRegions + ParameterValue: !Ref pCustomerControlTowerRegions + - ParameterKey: pCustomerControlTowerRegionsWithoutHomeRegion + ParameterValue: !Ref pCustomerControlTowerRegionsWithoutHomeRegion + - ParameterKey: pEnabledRegions + ParameterValue: !Ref pEnabledRegions + - ParameterKey: pEnabledRegionsWithoutHomeRegion + ParameterValue: !Ref pEnabledRegionsWithoutHomeRegion + - ParameterKey: pHomeRegion + ParameterValue: !Ref pHomeRegion + - ParameterKey: pLogArchiveAccountId + ParameterValue: !Ref pLogArchiveAccountId + - ParameterKey: pManagementAccountId + ParameterValue: !Ref pManagementAccountId + - ParameterKey: pOrganizationId + ParameterValue: !Ref pOrganizationId + - ParameterKey: pRootOrganizationalUnitId + ParameterValue: !Ref pRootOrganizationalUnitId + + rStagingS3BucketManagementAccountStackSet: + DependsOn: rControlTowerExecutionRoleStack + Type: AWS::CloudFormation::StackSet + Properties: + StackSetName: sra-staging-s3-bucket-management-account-regions + AdministrationRoleARN: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/service-role/AWSControlTowerStackSetRole + CallAs: SELF + Capabilities: + - CAPABILITY_NAMED_IAM + Description: Deploys an SRA Staging S3 Bucket + ExecutionRoleName: AWSControlTowerExecution + OperationPreferences: + FailureTolerancePercentage: 0 + MaxConcurrentPercentage: 100 + RegionConcurrencyType: PARALLEL + PermissionModel: SELF_MANAGED + StackInstancesGroup: + - DeploymentTargets: + Accounts: + - !Ref AWS::AccountId + Regions: !Split [',', pCustomerControlTowerRegionsWithoutHomeRegion] + TemplateURL: !Sub + - https://${SRAStagingS3BucketName}.s3.${AWS::Region}.${AWS::URLSuffix}/${pSRASolutionName}/templates/sra-common-prerequisites-staging-s3-bucket.yaml + - SRAStagingS3BucketName: !Sub ${pSRAStagingS3BucketNamePrefix}-${AWS::AccountId}-${AWS::Region} + Parameters: + - ParameterKey: pCreateLambdaLogGroup + ParameterValue: !Ref pCreateLambdaLogGroup + - ParameterKey: pLambdaLogGroupKmsKey + ParameterValue: !Ref pLambdaLogGroupKmsKey + - ParameterKey: pLambdaLogGroupRetention + ParameterValue: !Ref pLambdaLogGroupRetention + - ParameterKey: pLambdaLogLevel + ParameterValue: !Ref pLambdaLogLevel + - ParameterKey: pOrganizationId + ParameterValue: !Ref pOrganizationId + + rStagingS3BucketMemberAccountsStackSet: + Condition: cCreateSRAStagingS3BucketInMemberAccounts + DependsOn: rControlTowerExecutionRoleStack + Type: AWS::CloudFormation::StackSet + Properties: + StackSetName: sra-staging-s3-bucket-member-accounts + AutoDeployment: + Enabled: true + RetainStacksOnAccountRemoval: false + CallAs: SELF + Capabilities: + - CAPABILITY_NAMED_IAM + Description: Deploys an SRA Staging S3 Bucket + OperationPreferences: + FailureTolerancePercentage: 0 + MaxConcurrentPercentage: 100 + RegionConcurrencyType: PARALLEL + PermissionModel: SERVICE_MANAGED + StackInstancesGroup: + - DeploymentTargets: + OrganizationalUnitIds: + - !Ref pRootOrganizationalUnitId + Regions: !Split [',', !Ref pCustomerControlTowerRegions] + TemplateURL: !Sub + - https://${SRAStagingS3BucketName}.s3.${AWS::Region}.${AWS::URLSuffix}/${pSRASolutionName}/templates/sra-common-prerequisites-staging-s3-bucket.yaml + - SRAStagingS3BucketName: !Sub ${pSRAStagingS3BucketNamePrefix}-${AWS::AccountId}-${AWS::Region} + Parameters: + - ParameterKey: pCreateLambdaLogGroup + ParameterValue: !Ref pCreateLambdaLogGroup + - ParameterKey: pLambdaLogGroupKmsKey + ParameterValue: !Ref pLambdaLogGroupKmsKey + - ParameterKey: pLambdaLogGroupRetention + ParameterValue: !Ref pLambdaLogGroupRetention + - ParameterKey: pLambdaLogLevel + ParameterValue: !Ref pLambdaLogLevel + - ParameterKey: pOrganizationId + ParameterValue: !Ref pOrganizationId diff --git a/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-management-account-parameters.yaml b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-management-account-parameters.yaml new file mode 100644 index 00000000..bc89058b --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-management-account-parameters.yaml @@ -0,0 +1,286 @@ +######################################################################## +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +######################################################################## +AWSTemplateFormatVersion: 2010-09-09 +Description: + This template creates AWS Control Tower Account SSM Parameters. - 'common_prerequisites' solution in the repo, + https://github.com/aws-samples/aws-security-reference-architecture-examples +Metadata: + SRA: + Version: '1.0' + Order: '1' + + AWS::CloudFormation::Interface: + ParameterGroups: + - Label: + default: General Properties + Parameters: + - pSRASolutionTagKey + - pSRASolutionName + - pSRAStagingS3BucketName + - Label: + default: Management Account Parameters - Lambda Function Properties + Parameters: + - pManagementAccountParametersLambdaRoleName + - pManagementAccountParametersLambdaFunctionName + - Label: + default: General Lambda Function Properties + Parameters: + - pCreateLambdaLogGroup + - pLambdaLogGroupRetention + - pLambdaLogGroupKmsKey + - pLambdaLogLevel + ParameterLabels: + pCreateLambdaLogGroup: + default: Create Lambda Log Group + pLambdaLogGroupKmsKey: + default: (Optional) Lambda Logs KMS Key + pLambdaLogGroupRetention: + default: Lambda Log Group Retention + pLambdaLogLevel: + default: Lambda Log Level + pManagementAccountParametersLambdaFunctionName: + default: Management Account Parameters - Lambda Function Name + pManagementAccountParametersLambdaRoleName: + default: Management Account Parameters - Lambda Role Name + pSRASolutionName: + default: SRA Solution Name + pSRASolutionTagKey: + default: SRA Solution Tag Key + pSRAStagingS3BucketName: + default: (Optional) SRA Staging S3 Bucket Name + +Parameters: + pCreateLambdaLogGroup: + AllowedValues: ['true', 'false'] + Default: 'false' + Description: + Indicates whether a CloudWatch Log Group should be explicitly created for the Lambda function, to allow for setting a Log Retention and/or KMS + Key for encryption. + Type: String + pLambdaLogGroupKmsKey: + AllowedPattern: '^$|^arn:(aws[a-zA-Z-]*){1}:kms:[a-z0-9-]+:\d{12}:key\/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$' + ConstraintDescription: 'Key ARN example: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' + Description: + (Optional) KMS Key ARN to use for encrypting the Lambda logs data. If empty, encryption is enabled with CloudWatch Logs managing the server-side + encryption keys. + Type: String + pLambdaLogGroupRetention: + AllowedValues: [1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653] + Default: 14 + Description: Specifies the number of days you want to retain log events + Type: String + pLambdaLogLevel: + AllowedValues: [INFO, ERROR, DEBUG] + Default: INFO + Description: Lambda Function Logging Level + Type: String + pManagementAccountParametersLambdaFunctionName: + AllowedPattern: '^[\w-]{1,64}$' + ConstraintDescription: Max 64 alphanumeric characters. Also special characters supported [_, -] + Default: sra-management-account-parameters + Description: Lambda function name for creating Control Tower account SSM parameters. + Type: String + pManagementAccountParametersLambdaRoleName: + AllowedPattern: '^[\w+=,.@-]{1,64}$' + ConstraintDescription: Max 64 alphanumeric characters. Also special characters supported [+, =, ., @, -]. + Default: sra-management-account-parameters-lambda + Description: Lambda execution role for creating Control Tower account SSM parameters. + Type: String + pSRASolutionName: + AllowedValues: [sra-common-prerequisites] + Default: sra-common-prerequisites + Description: The SRA solution name. The default value is the folder name of the solution + Type: String + pSRASolutionTagKey: + AllowedValues: [sra-solution] + Default: sra-solution + Description: The SRA solution tag key applied to all resources created by the solution that support tagging. The value is the pSRASolutionName. + Type: String + pSRAStagingS3BucketName: + AllowedPattern: '^$|^[0-9a-zA-Z]+([0-9a-zA-Z-]*[0-9a-zA-Z])*$' + ConstraintDescription: + S3 bucket name can include numbers, lowercase letters, uppercase letters, and hyphens (-). It cannot start or end with a hyphen (-). + Description: + (Optional) SRA Staging S3 bucket name for the artifacts relevant to solution. (e.g., lambda zips, CloudFormation templates). If empty, the SRA + Staging S3 bucket name will be resolved from the SSM Parameter '/sra/staging-s3-bucket-name'. + Type: String + +Conditions: + cCreateLambdaLogGroup: !Equals [!Ref pCreateLambdaLogGroup, 'true'] + cUseKmsKey: !Not [!Equals [!Ref pLambdaLogGroupKmsKey, '']] + cUseSRAStagingS3BucketNameSSMParameter: !Equals [!Ref pSRAStagingS3BucketName, ''] + +Resources: + rManagementAccountParametersLambdaCustomResource: + Type: Custom::LambdaCustomResource + Version: '1.0' + Properties: + ServiceToken: !GetAtt rManagementAccountParametersLambdaFunction.Arn + TAG_KEY: !Ref pSRASolutionTagKey + TAG_VALUE: !Ref pSRASolutionName + + rManagementAccountParametersLambdaFunction: + Metadata: + cfn_nag: + rules_to_suppress: + - id: W58 + reason: Lambda role provides access to CloudWatch Logs + - id: W89 + reason: Lambda does not need to communicate with VPC resources. + - id: W92 + reason: Lambda does not need reserved concurrent executions. + checkov: + - checkov:skip=CKV_AWS_116:DLQ not needed, as Lambda function only triggered by CloudFormation events. + - checkov:skip=CKV_AWS_173:Environment variables are not sensitive + Type: AWS::Lambda::Function + Properties: + FunctionName: !Ref pManagementAccountParametersLambdaFunctionName + Description: Creates Control Tower account SSM Parameters in the Management Account + Architectures: [arm64] + Handler: app.lambda_handler + Role: !GetAtt rManagementAccountParametersLambdaRole.Arn + Runtime: python3.9 + Timeout: 300 + Code: + S3Bucket: !If + - cUseSRAStagingS3BucketNameSSMParameter + - '{{resolve:ssm:/sra/staging-s3-bucket-name}}' + - !Ref pSRAStagingS3BucketName + S3Key: !Sub ${pSRASolutionName}/lambda_code/${pSRASolutionName}.zip + Environment: + Variables: + LOG_LEVEL: !Ref pLambdaLogLevel + TAG_KEY: !Ref pSRASolutionTagKey + TAG_VALUE: !Ref pSRASolutionName + Tags: + - Key: !Ref pSRASolutionTagKey + Value: !Ref pSRASolutionName + + rManagementAccountParametersLambdaLogGroup: + Condition: cCreateLambdaLogGroup + DeletionPolicy: Retain + Type: AWS::Logs::LogGroup + UpdateReplacePolicy: Retain + Properties: + LogGroupName: !Sub /aws/lambda/${pManagementAccountParametersLambdaFunctionName} + KmsKeyId: !If + - cUseKmsKey + - !Ref pLambdaLogGroupKmsKey + - !Ref AWS::NoValue + RetentionInDays: !Ref pLambdaLogGroupRetention + + rManagementAccountParametersLambdaRole: + Type: AWS::IAM::Role + Metadata: + cfn_nag: + rules_to_suppress: + - id: W11 + reason: Allow * in resource when required + - id: W28 + reason: The role name is defined to identify automation resources + Properties: + RoleName: !Ref pManagementAccountParametersLambdaRoleName + Description: !Sub Role for '${pManagementAccountParametersLambdaRoleName}' Lambda function + AssumeRolePolicyDocument: + Version: 2012-10-17 + Statement: + - Effect: Allow + Action: sts:AssumeRole + Principal: + Service: + - lambda.amazonaws.com + Tags: + - Key: !Ref pSRASolutionTagKey + Value: !Ref pSRASolutionName + Policies: + - PolicyName: ssm-account-parameter-creator + PolicyDocument: + Version: 2012-10-17 + Statement: + - Sid: STSOrganizationRead + Effect: Allow + Action: + - organizations:DescribeOrganization + - organizations:ListAccounts + - organizations:ListRoots + Resource: '*' + - Sid: CloudFormationRead + Effect: Allow + Action: + - cloudformation:DescribeStackSet + - cloudformation:ListStackInstances + Resource: '*' + - Sid: SSMParameterRead + Effect: Allow + Action: ssm:DescribeParameters + Resource: '*' + - Sid: SSMParameterReadValues + Effect: Allow + Action: ssm:GetParameters + Resource: !Sub arn:${AWS::Partition}:ssm:*:${AWS::AccountId}:parameter/sra/* + - Sid: SSMParameterWrite + Effect: Allow + Action: + - ssm:AddTagsToResource + - ssm:DeleteParameters + - ssm:PutParameter + Resource: !Sub arn:${AWS::Partition}:ssm:*:${AWS::AccountId}:parameter/sra/* + - Sid: TagsRead + Effect: Allow + Action: tag:GetResources + Resource: '*' + - PolicyName: CloudWatchLogGroup + PolicyDocument: + Version: 2012-10-17 + Statement: + - Sid: CloudWatchLogs + Effect: Allow + Action: + - logs:CreateLogGroup + - logs:CreateLogStream + - logs:PutLogEvents + Resource: !Sub arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${pManagementAccountParametersLambdaFunctionName}:log-stream:* + +Outputs: + oAuditAccountId: + Description: Audit Account ID + Value: !GetAtt rManagementAccountParametersLambdaCustomResource.AuditAccountId + oCustomerControlTowerRegions: + Description: Customer Control Tower Regions + Value: !Join [',', !GetAtt rManagementAccountParametersLambdaCustomResource.CustomerControlTowerRegions] + oCustomerControlTowerRegionsWithoutHomeRegion: + Description: Customer Control Tower Regions without Home Region + Value: !Join [',', !GetAtt rManagementAccountParametersLambdaCustomResource.CustomerControlTowerRegionsWithoutHomeRegion] + oEnabledRegions: + Description: Enabled Regions + Value: !Join [',', !GetAtt rManagementAccountParametersLambdaCustomResource.EnabledRegions] + oEnabledRegionsWithoutHomeRegion: + Description: Enabled Regions without Home Region + Value: !Join [',', !GetAtt rManagementAccountParametersLambdaCustomResource.EnabledRegionsWithoutHomeRegion] + oHomeRegion: + Description: Control Tower Home Region + Value: !GetAtt rManagementAccountParametersLambdaCustomResource.HomeRegion + oLogArchiveAccountId: + Description: Log Archive Account ID + Value: !GetAtt rManagementAccountParametersLambdaCustomResource.LogArchiveAccountId + oManagementAccountId: + Description: Management Account ID + Value: !GetAtt rManagementAccountParametersLambdaCustomResource.ManagementAccountId + oOrganizationId: + Description: Organization ID + Value: !GetAtt rManagementAccountParametersLambdaCustomResource.OrganizationId + oRootOrganizationalUnitId: + Description: Root Organizational Unit ID + Value: !GetAtt rManagementAccountParametersLambdaCustomResource.RootOrganizationalUnitId + oManagementAccountParametersLambdaFunctionArn: + Description: Management Account Parameters Lambda Function ARN + Value: !GetAtt rManagementAccountParametersLambdaFunction.Arn + oManagementAccountParametersLambdaLogGroupArn: + Condition: cCreateLambdaLogGroup + Description: Management Account Parameters Lambda Log Group ARN + Value: !GetAtt rManagementAccountParametersLambdaLogGroup.Arn + oManagementAccountParametersLambdaRoleArn: + Description: Management Account Parameters Lambda Role ARN + Value: !GetAtt rManagementAccountParametersLambdaRole.Arn diff --git a/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-member-account-parameters.yaml b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-member-account-parameters.yaml new file mode 100644 index 00000000..2dfea22d --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-member-account-parameters.yaml @@ -0,0 +1,277 @@ +######################################################################## +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +######################################################################## +AWSTemplateFormatVersion: 2010-09-09 +Description: + This template creates the pre-requisite SSM parameters for staging the SRA solutions in the member accounts by resolving the corresponding SSM + parameters in the management account. - 'common_prerequisites' solution in the repo, + https://github.com/aws-samples/aws-security-reference-architecture-examples +Metadata: + SRA: + Version: '1.0' + Order: '2' + + AWS::CloudFormation::Interface: + ParameterGroups: + - Label: + Description: General Properties + Parameters: + - pSRASolutionName + - Label: + Description: Control Tower SSM Parameters + Parameters: + - pAuditAccountId + - pLogArchiveAccountId + - pManagementAccountId + - pRootOrganizationalUnitId + - pOrganizationId + - pHomeRegion + - Label: + Description: Region SSM Parameters + Parameters: + - pCustomerControlTowerRegions + - pCustomerControlTowerRegionsWithoutHomeRegion + - pEnabledRegions + - pEnabledRegionsWithoutHomeRegion + ParameterLabels: + pAuditAccountId: + default: Audit Account ID + pCustomerControlTowerRegions: + default: Customer Control Tower Regions + pCustomerControlTowerRegionsWithoutHomeRegion: + default: Customer Control Tower Regions without Home Region + pEnabledRegions: + default: Enabled Regions + pEnabledRegionsWithoutHomeRegion: + default: Enabled Regions without Home Region + pHomeRegion: + default: Control Tower Home Region + pLogArchiveAccountId: + default: Log Archive Account ID + pManagementAccountId: + default: Management Account ID + pOrganizationId: + default: Organization ID + pRootOrganizationalUnitId: + default: Root Organizational Unit ID + pSRASolutionName: + default: SRA Solution Name + +Parameters: + pAuditAccountId: + AllowedPattern: '^\d{12}$' + ConstraintDescription: Must be 12 digits. + Description: AWS Account ID of the Control Tower Audit account. + Type: String + pCustomerControlTowerRegions: + AllowedPattern: '^([a-z0-9-]{1,64})$|^(([a-z0-9-]{1,64},)*[a-z0-9-]{1,64})$' + ConstraintDescription: + Only lowercase letters, numbers, and hyphens ('-') allowed. (e.g. us-east-1) Additional AWS regions can be provided, separated by commas. (e.g. + us-east-1,ap-southeast-2) + Description: Customer Control Tower regions (2+ regions, separate by commas) + Type: String + pCustomerControlTowerRegionsWithoutHomeRegion: + AllowedPattern: '^([a-z0-9-]{1,64})$|^(([a-z0-9-]{1,64},)*[a-z0-9-]{1,64})$' + ConstraintDescription: + Only lowercase letters, numbers, and hyphens ('-') allowed. (e.g. us-east-1) Additional AWS regions can be provided, separated by commas. (e.g. + us-east-1,ap-southeast-2) + Description: Customer Control Tower regions without Home Region (2+ regions, separate by commas) + Type: String + pEnabledRegions: + AllowedPattern: '^([a-z0-9-]{1,64})$|^(([a-z0-9-]{1,64},)*[a-z0-9-]{1,64})$' + ConstraintDescription: + Only lowercase letters, numbers, and hyphens ('-') allowed. (e.g. us-east-1) Additional AWS regions can be provided, separated by commas. (e.g. + us-east-1,ap-southeast-2) + Description: Enabled regions (2+ regions, separate by commas) + Type: String + pEnabledRegionsWithoutHomeRegion: + AllowedPattern: '^([a-z0-9-]{1,64})$|^(([a-z0-9-]{1,64},)*[a-z0-9-]{1,64})$' + ConstraintDescription: + Only lowercase letters, numbers, and hyphens ('-') allowed. (e.g. us-east-1) Additional AWS regions can be provided, separated by commas. (e.g. + us-east-1,ap-southeast-2) + Description: Enabled regions without Home Region (2+ regions, separate by commas) + Type: String + pHomeRegion: + AllowedPattern: '^[a-z0-9-]{1,64}$' + ConstraintDescription: AWS Region Example - 'us-east-1', 'ap-southeast-2' + Description: Name of the Control Tower home region + Type: String + pLogArchiveAccountId: + AllowedPattern: '^\d{12}$' + ConstraintDescription: Must be 12 digits. + Description: AWS Account ID of the Control Tower Log Archive account. + Type: String + pManagementAccountId: + AllowedPattern: '^\d{12}$' + ConstraintDescription: Must be 12 digits. + Description: AWS Account ID of the Control Tower Management account. + Type: String + pOrganizationId: + AllowedPattern: '^$|^o-[a-z0-9]{10,32}$' + ConstraintDescription: Must start with 'o-' followed by from 10 to 32 lowercase letters or digits. (e.g. o-abc1234567) + Description: AWS Organizations ID + Type: String + pRootOrganizationalUnitId: + AllowedPattern: '^r-[0-9a-z]{4,32}$' + ConstraintDescription: Must start with 'r-' followed by from 4 to 32 lowercase letters or digits. (e.g. r-abc123) + Description: Root Organizational Unit ID + Type: String + pSRASolutionName: + AllowedValues: [sra-common-prerequisites] + Default: sra-common-prerequisites + Description: The SRA solution name. The Description value is the folder name of the solution + Type: String + +Resources: + rSSMParameterAuditAccountId: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/control-tower/audit-account-id + Type: String + Value: !Ref pAuditAccountId + Description: Audit Account ID SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + + rSSMParameterCustomerControlTowerRegions: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/regions/customer-control-tower-regions + Type: StringList + Value: !Ref pCustomerControlTowerRegions + Description: Customer Control Tower Regions SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + + rSSMParameterCustomerControlTowerRegionsWithoutHomeRegion: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/regions/customer-control-tower-regions-without-home-region + Type: StringList + Value: !Ref pCustomerControlTowerRegionsWithoutHomeRegion + Description: Customer Control Tower Regions without Home Region SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + + rSSMParameterEnabledRegions: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/regions/enabled-regions + Type: StringList + Value: !Ref pEnabledRegions + Description: Enabled Regions SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + + rSSMParameterEnabledRegionsWithoutHomeRegion: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/regions/enabled-regions-without-home-region + Type: StringList + Value: !Ref pEnabledRegionsWithoutHomeRegion + Description: Enabled Regions without Home Region SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + + rSSMParameterHomeRegion: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/control-tower/home-region + Type: String + Value: !Ref pHomeRegion + Description: Home Region SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + + rSSMParameterLogArchiveAccountId: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/control-tower/log-archive-account-id + Type: String + Value: !Ref pLogArchiveAccountId + Description: Log Archive Account ID SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + + rSSMParameterManagementAccountId: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/control-tower/management-account-id + Type: String + Value: !Ref pManagementAccountId + Description: Management Account ID SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + + rSSMParameterOrganizationId: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/control-tower/organization-id + Type: String + Value: !Ref pOrganizationId + Description: Organization ID SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + + rSSMParameterRootOrganizationalUnitId: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/control-tower/root-organizational-unit-id + Type: String + Value: !Ref pRootOrganizationalUnitId + Description: Root Organizational Unit ID SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + +Outputs: + oAuditAccountId: + Description: Audit Account ID + Value: !Ref pAuditAccountId + oCustomerRegions: + Description: Customer Regions + Value: !Ref pCustomerControlTowerRegions + oCustomerRegionsWithoutHomeRegion: + Description: Customer Regions without Home Region + Value: !Ref pCustomerControlTowerRegionsWithoutHomeRegion + oEnabledRegions: + Description: Enabled Regions + Value: !Ref pEnabledRegionsWithoutHomeRegion + oEnabledRegionsWithoutHomeRegion: + Description: Enabled Regions without Home Region + Value: !Ref pEnabledRegionsWithoutHomeRegion + oHomeRegion: + Description: Control Tower Home Region + Value: !Ref pHomeRegion + oLogArchiveAccountId: + Description: Log Archive Account ID + Value: !Ref pLogArchiveAccountId + oManagementAccountId: + Description: Management Account ID + Value: !Ref pManagementAccountId + oOrganizationId: + Description: Organization ID + Value: !Ref pOrganizationId + oRootOrganizationalUnitId: + Description: Root Organizational Unit ID + Value: !Ref pRootOrganizationalUnitId diff --git a/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-staging-s3-bucket.yaml b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-staging-s3-bucket.yaml new file mode 100644 index 00000000..ca89af1f --- /dev/null +++ b/aws_sra_examples/solutions/common/common_prerequisites/templates/sra-common-prerequisites-staging-s3-bucket.yaml @@ -0,0 +1,394 @@ +######################################################################## +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +######################################################################## +AWSTemplateFormatVersion: '2010-09-09' +Description: + Creates the SRA staging S3 bucket to store solution Lambda source code, CloudFormation templates, and other deployment files. - + 'common_prerequisites' solution in the repo, https://github.com/aws-samples/aws-security-reference-architecture-examples +Metadata: + SRA: + Version: '1.0' + Order: '1' + + AWS::CloudFormation::Interface: + ParameterGroups: + - Label: + default: General Properties + Parameters: + - pSRASolutionTagKey + - pSRASolutionName + - pSRAStagingS3BucketNamePrefix + - pAWSControlTowerExecutionRoleName + - pOrganizationId + - Label: + default: AWS Organization ID - Lambda Function Properties + Parameters: + - pOrgIdLambdaRoleName + - pOrgIdLambdaFunctionName + - Label: + default: General Lambda Function Properties + Parameters: + - pCreateLambdaLogGroup + - pLambdaLogGroupRetention + - pLambdaLogGroupKmsKey + - pLambdaLogLevel + ParameterLabels: + pCreateLambdaLogGroup: + default: Create Lambda Log Group + pLambdaLogGroupKmsKey: + default: (Optional) Lambda Logs KMS Key + pLambdaLogGroupRetention: + default: Lambda Log Group Retention + pLambdaLogLevel: + default: Lambda Log Level + pOrgIdLambdaFunctionName: + default: AWS Organization ID - Lambda Function Name + pOrgIdLambdaRoleName: + default: AWS Organization ID - Lambda Role Name + pOrganizationId: + default: (Optional) AWS Organization ID + pSRASolutionName: + default: SRA Solution Name + pSRASolutionTagKey: + default: SRA Solution Tag Key + pSRAStagingS3BucketNamePrefix: + default: SRA Staging S3 Bucket Name Prefix + +Parameters: + pAWSControlTowerExecutionRoleName: + AllowedValues: [AWSControlTowerExecution] + Default: AWSControlTowerExecution + Description: The AWS Control Tower Execution IAM Role used to deploy resources within accounts + Type: String + pCreateLambdaLogGroup: + AllowedValues: ['true', 'false'] + Default: 'false' + Description: + Indicates whether a CloudWatch Log Group should be explicitly created for the Lambda function, to allow for setting a Log Retention and/or KMS + Key for encryption. + Type: String + pLambdaLogGroupKmsKey: + AllowedPattern: '^$|^arn:(aws[a-zA-Z-]*){1}:kms:[a-z0-9-]+:\d{12}:key\/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$' + ConstraintDescription: 'Key ARN example: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' + Description: + (Optional) KMS Key ARN to use for encrypting the Lambda logs data. If empty, encryption is enabled with CloudWatch Logs managing the server-side + encryption keys. + Type: String + pLambdaLogGroupRetention: + AllowedValues: [1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653] + Default: 14 + Description: Specifies the number of days you want to retain log events + Type: String + pLambdaLogLevel: + AllowedValues: [INFO, ERROR, DEBUG] + Default: INFO + Description: Lambda Function Logging Level + Type: String + pOrgIdLambdaFunctionName: + AllowedPattern: '^[\w-]{1,64}$' + ConstraintDescription: Max 64 alphanumeric characters. Also special characters supported [_, -] + Default: sra-org-id + Description: Lambda function name for getting the AWS Organization ID + Type: String + pOrgIdLambdaRoleName: + AllowedPattern: '^[\w+=,.@-]{1,64}$' + ConstraintDescription: Max 64 alphanumeric characters. Also special characters supported [+, =, ., @, -]. + Default: sra-org-id-lambda + Description: Lambda execution role for getting the AWS Organization ID + Type: String + pOrganizationId: + AllowedPattern: '^$|^o-[a-z0-9]{10,32}$' + ConstraintDescription: Must start with 'o-' followed by from 10 to 32 lowercase letters or digits. (e.g. o-abc1234567) + Description: (Optional) AWS Organizations ID. If empty, custom resource will be deployed to determine the AWS Organization ID. + Type: String + pSRASolutionName: + AllowedValues: [sra-common-prerequisites] + Default: sra-common-prerequisites + Description: The SRA solution name. The default value is the folder name of the solution + Type: String + pSRASolutionTagKey: + AllowedValues: [sra-solution] + Default: sra-solution + Description: The SRA solution tag key applied to all resources created by the solution that support tagging. The value is the pSRASolutionName. + Type: String + pSRAStagingS3BucketNamePrefix: + AllowedValues: [sra-staging] + Default: sra-staging + Description: + SRA Staging S3 bucket name prefix for the SRA artifacts relevant to the solutions. (e.g., lambda zips, CloudFormation templates). The account + and region are added to the prefix --. Example = sra-staging-123456789012-us-east-1. + Type: String + +Conditions: + cCreateCustomResource: !Equals [!Ref pOrganizationId, ''] + cCreateLambdaLogGroup: !Equals [!Ref pCreateLambdaLogGroup, 'true'] + cCreateLambdaLogGroupAndCreateCustomResource: !And + - !Condition cCreateCustomResource + - !Condition cCreateLambdaLogGroup + cUsingKmsKey: !Not [!Equals [!Ref pLambdaLogGroupKmsKey, '']] + +Resources: + rOrgIdLambdaCustomResource: + Condition: cCreateCustomResource + Type: Custom::LambdaCustomResource + Version: '1.0' + Properties: + ServiceToken: !GetAtt rOrgIdLambdaFunction.Arn + + rOrgIdLambdaFunction: + Condition: cCreateCustomResource + Metadata: + cfn_nag: + rules_to_suppress: + - id: W58 + reason: Lambda role provides access to CloudWatch Logs + - id: W89 + reason: Lambda does not need to communicate with VPC resources. + - id: W92 + reason: Lambda does not need reserved concurrent executions. + checkov: + - checkov:skip=CKV_AWS_116:DLQ not needed, as Lambda function only triggered by CloudFormation events. + - checkov:skip=CKV_AWS_173:Environment variables are not sensitive + Type: AWS::Lambda::Function + Properties: + FunctionName: !Ref pOrgIdLambdaFunctionName + Description: Get AWS Organization ID + Architectures: [arm64] + Handler: index.lambda_handler + Role: !GetAtt rOrgIdLambdaRole.Arn + Runtime: python3.9 + Timeout: 60 + Environment: + Variables: + LOG_LEVEL: !Ref pLambdaLogLevel + Tags: + - Key: !Ref pSRASolutionTagKey + Value: !Ref pSRASolutionName + Code: + ZipFile: | + # type: ignore + """Custom Resource to get AWS Organization ID. + + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + SPDX-License-Identifier: MIT-0 + """ + import logging + import os + + import boto3 + import cfnresponse + + LOGGER = logging.getLogger(__name__) + log_level = os.environ.get("LOG_LEVEL", logging.ERROR) + LOGGER.setLevel(log_level) + + + def get_org_id(): + """Get AWS Organization ID. + + Returns: + Response data for custom resource + """ + management_account_session = boto3.Session() + org_client = management_account_session.client("organizations") + response = org_client.describe_organization()["Organization"] + LOGGER.debug({"API_Call": "organizations:DescribeOrganization", "API_Response": response}) + return {"OrganizationId": response["Id"]} + + + def lambda_handler(event, context): + """Lambda Handler. + + Args: + event: event data + context: runtime information + """ + try: + data = get_org_id() + cfnresponse.send(event, context, cfnresponse.SUCCESS, data, data["OrganizationId"]) + except Exception as error: + LOGGER.error({"Unexpected Error": error}) + reason = f"See the details in CloudWatch Log Stream: '{context.log_group_name}'" + cfnresponse.send(event, context, cfnresponse.FAILED, {}, data["OrganizationId"], reason=reason) + + rOrgIdLambdaLogGroup: + Condition: cCreateLambdaLogGroupAndCreateCustomResource + DeletionPolicy: Retain + Type: AWS::Logs::LogGroup + UpdateReplacePolicy: Retain + Properties: + LogGroupName: !Sub /aws/lambda/${pOrgIdLambdaFunctionName} + KmsKeyId: !If + - cUsingKmsKey + - !Ref pLambdaLogGroupKmsKey + - !Ref AWS::NoValue + RetentionInDays: !Ref pLambdaLogGroupRetention + + rOrgIdLambdaRole: + Condition: cCreateCustomResource + Type: AWS::IAM::Role + Metadata: + cfn_nag: + rules_to_suppress: + - id: W11 + reason: Allow * in resource when required + - id: W28 + reason: The role name is defined to identify automation resources + Properties: + RoleName: !Ref pOrgIdLambdaRoleName + Description: !Sub Role for '${pOrgIdLambdaRoleName}' Lambda function + AssumeRolePolicyDocument: + Version: 2012-10-17 + Statement: + - Effect: Allow + Action: sts:AssumeRole + Principal: + Service: + - lambda.amazonaws.com + Tags: + - Key: !Ref pSRASolutionTagKey + Value: !Ref pSRASolutionName + Policies: + - PolicyName: org-id + PolicyDocument: + Version: 2012-10-17 + Statement: + - Sid: OrganizationRead + Effect: Allow + Action: organizations:DescribeOrganization + Resource: '*' + - PolicyName: CloudWatchLogGroup + PolicyDocument: + Version: 2012-10-17 + Statement: + - Sid: CloudWatchLogs + Effect: Allow + Action: + - logs:CreateLogGroup + - logs:CreateLogStream + - logs:PutLogEvents + Resource: !Sub arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${pOrgIdLambdaFunctionName}:log-stream:* + + rSRAStagingS3Bucket: + Type: AWS::S3::Bucket + Metadata: + cfn_nag: + rules_to_suppress: + - id: W35 + reason: S3 access logs intentionally not enabled + checkov: + - checkov:skip=CKV_AWS_18:S3 access logs intentionally not enabled + Properties: + BucketName: !Sub ${pSRAStagingS3BucketNamePrefix}-${AWS::AccountId}-${AWS::Region} + BucketEncryption: + ServerSideEncryptionConfiguration: + - ServerSideEncryptionByDefault: + SSEAlgorithm: AES256 + OwnershipControls: + Rules: + - ObjectOwnership: BucketOwnerPreferred + PublicAccessBlockConfiguration: + BlockPublicAcls: True + BlockPublicPolicy: True + IgnorePublicAcls: True + RestrictPublicBuckets: True + Tags: + - Key: !Ref pSRASolutionTagKey + Value: !Ref pSRASolutionName + VersioningConfiguration: + Status: Enabled + + rSRAStagingS3BucketPolicy: + Type: AWS::S3::BucketPolicy + Metadata: + cfn_nag: + rules_to_suppress: + - id: F16 + reason: GetObject is restricted to AWS accounts within the AWS Organization + Properties: + Bucket: !Ref rSRAStagingS3Bucket + PolicyDocument: + Version: 2012-10-17 + Statement: + - Sid: AllowDeploymentRoleGetObject + Effect: Allow + Action: s3:GetObject + Principal: '*' + Resource: !Sub arn:${AWS::Partition}:s3:::${rSRAStagingS3Bucket}/* + Condition: + ArnLike: + aws:PrincipalArn: !Sub arn:${AWS::Partition}:iam::*:${pAWSControlTowerExecutionRoleName} + + - Sid: DenyExternalPrincipals + Effect: Deny + Action: 's3:*' + Principal: '*' + Resource: + - !Sub arn:${AWS::Partition}:s3:::${rSRAStagingS3Bucket} + - !Sub arn:${AWS::Partition}:s3:::${rSRAStagingS3Bucket}/* + Condition: + StringNotEquals: + aws:PrincipalOrgID: !If + - cCreateCustomResource + - !GetAtt rOrgIdLambdaCustomResource.OrganizationId + - !Ref pOrganizationId + + - Sid: SecureTransport + Effect: Deny + Action: 's3:*' + Principal: '*' + Resource: + - !Sub arn:${AWS::Partition}:s3:::${rSRAStagingS3Bucket} + - !Sub arn:${AWS::Partition}:s3:::${rSRAStagingS3Bucket}/* + Condition: + Bool: + aws:SecureTransport: False + + rSSMParameterSRAStagingS3BucketName: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/staging-s3-bucket-name + Type: String + Value: !Ref rSRAStagingS3Bucket + Description: SRA Staging S3 Bucket Name SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + + rSSMParameterSRAStagingS3BucketNamePrefix: + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Type: AWS::SSM::Parameter + Properties: + Name: /sra/staging-s3-bucket-name-prefix + Type: String + Value: !Ref pSRAStagingS3BucketNamePrefix + Description: SRA Staging S3 Bucket Name Prefix SSM parameter + Tags: + sra-solution: !Ref pSRASolutionName + +Outputs: + oOrganizationId: + Condition: cCreateCustomResource + Description: Organization ID + Value: !GetAtt rOrgIdLambdaCustomResource.OrganizationId + oOrgIdLambdaFunctionArn: + Condition: cCreateCustomResource + Description: AWS Organization ID Lambda Function ARN + Value: !GetAtt rOrgIdLambdaFunction.Arn + oOrgIdLambdaLogGroupArn: + Condition: cCreateLambdaLogGroupAndCreateCustomResource + Description: AWS Organization ID Lambda Log Group ARN + Value: !GetAtt rOrgIdLambdaLogGroup.Arn + oOrgIdLambdaRoleArn: + Condition: cCreateCustomResource + Description: AWS Organization ID Lambda Role ARN + Value: !GetAtt rOrgIdLambdaRole.Arn + oSRAStagingS3BucketName: + Description: SRA Staging S3 Bucket Name SSM parameter + Value: !GetAtt rSSMParameterSRAStagingS3BucketName.Value + oSRAStagingS3BucketNamePrefix: + Description: SRA Staging S3 Bucket Name Prefix SSM parameter + Value: !GetAtt rSSMParameterSRAStagingS3BucketNamePrefix.Value diff --git a/aws_sra_examples/utils/packaging_scripts/stage_solution.sh b/aws_sra_examples/utils/packaging_scripts/stage_solution.sh new file mode 100755 index 00000000..1cc176b0 --- /dev/null +++ b/aws_sra_examples/utils/packaging_scripts/stage_solution.sh @@ -0,0 +1,183 @@ +#!/usr/bin/env bash +set -e + +########################################################################################### +# Purpose: This script stages the solution Lambda function zip and CloudFormation templates by: +# 1. Creating an S3 bucket to hold the deployment resources +# 2. Packaging and uploading Lambda code to the S3 bucket lambda_code folder +# 4. Uploading the CloudFormation templates to the S3 bucket templates folder +# Usage: ~/aws-security-reference-architecture-examples/aws_sra_examples/utils/packaging_scripts/stage_solution.sh \ +# --staging_bucket_name \ +# --solution_directory +# Example: ~/aws-security-reference-architecture-examples/aws_sra_examples/utils/packaging_scripts/stage_solution.sh \ +# --staging_bucket_name sra-staging-123456789012-us-east-1 \ +# --solution_directory ~/aws-security-reference-architecture-examples/aws_sra_examples/solutions/cloudtrail/cloudtrail_org +########################################################################################### +# shellcheck disable=SC2086 +usage="$(basename $0) [-h] [--staging_bucket_name s] <--solution_directory s> ---script stage solution Lambda code and CloudFormation templates + +where: + -h show this help text + --staging_bucket_name [optional] S3 Staging Bucket to upload files, example = sra-staging-123456789012-us-east-1 + --solution_directory SRA Solution Directory Path, example = ~/aws-security-reference-architecture-examples/aws_sra_examples/solutions/cloudtrail/cloudtrail_org" + +if [[ $1 == "-h" ]]; then + echo "$usage" + exit 1 +fi + +staging_bucket_name=${staging_bucket_name:-none} +solution_directory=${solution_directory:-none} + +# read input parameters +while [ $# -gt 0 ]; do + + if [[ $1 == *"--"* ]]; then + param="${1/--/}" + declare "$param"="$2" + # echo $1 $2 // Optional to see the parameter:value result + fi + + shift +done + +if [ "$solution_directory" != "none" ]; then + ########################################################################################### + # Configuration Parameters + ########################################################################################### + HERE="${PWD}" + SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" + cd "$solution_directory" || exit 1 # change directory into solution directory + SOLUTION_NAME_SNAKE_CASE=$(basename "$PWD") # get the solution name from the directory name + SOLUTION_NAME="sra-"$(tr '_' '-' <<<"$SOLUTION_NAME_SNAKE_CASE") + + LAMBDA_S3_PREFIX="$SOLUTION_NAME/lambda_code" + TEMPLATES_S3_PREFIX="$SOLUTION_NAME/templates" + STAGING_BUCKET="$staging_bucket_name" + SRA_STAGING_FOLDER_NAME="sra_staging_manual_upload" + TMP_FOLDER_NAME="$HOME/temp_sra_lambda_src_XXXX" # will be cleaned + ########################################################################################### + # End Configuration Parameters + ########################################################################################### + + # create the staging folder + echo "...Creating the $SRA_STAGING_FOLDER_NAME folder" + cd "$SCRIPT_DIR" || exit 1 + cd ../../../ || exit 1 # change directory into the base folder of the sra code + mkdir -p "$SRA_STAGING_FOLDER_NAME" || exit 1 # create staging folder, if it doesn't exist + + cd "$SRA_STAGING_FOLDER_NAME" || exit 1 + STAGING_FOLDER="${PWD}" + mkdir -p "$TEMPLATES_S3_PREFIX" || exit 1 # create the staging templates folder + mkdir -p "$LAMBDA_S3_PREFIX" || exit 1 # create the staging lambda folder + + STAGING_TEMPLATES_FOLDER="$STAGING_FOLDER/$TEMPLATES_S3_PREFIX" || exit 1 + STAGING_LAMBDA_FOLDER="$STAGING_FOLDER/$LAMBDA_S3_PREFIX" || exit 1 + + # CloudFormation Stacks + echo "## Stage CloudFormation Templates" + cd "$solution_directory" || exit 1 # change directory into solution directory + + cp -r ./templates/* "$STAGING_TEMPLATES_FOLDER/" || exit 1 # copy CloudFormation templates to staging folder + + # Package and Stage Lambda Code + echo "## Package and Stage Lambda Code" + lambda_folder_count=0 + for dir in "$solution_directory"/lambda/*/; do + lambda_folder_count=$((lambda_folder_count + 1)) + done + for dir in "$solution_directory"/lambda/*/; do + lambda_dir="${dir%"${dir##*[!/]}"}" + lambda_dir="${lambda_dir##*/}" # remove everything before the last / + + cd "$dir" || exit 1 + has_python=$(find ./*.py 2>/dev/null | wc -l) + has_requirements=$(find requirements.txt 2>/dev/null | wc -l) + + if [ "$has_python" -ne 0 ] && [ "$has_requirements" -ne 0 ]; then + echo "...Creating the temporary packaging folder (tmp_sra_lambda_src_XXXX)" + TMP_FOLDER=$(mktemp -d "$TMP_FOLDER_NAME") || exit 1 # create the temp folder + cp -r "$dir"* "$TMP_FOLDER" || exit 1 # copy lambda source to temp source folder + pip3 --disable-pip-version-check install -t "$TMP_FOLDER" -r "$TMP_FOLDER/requirements.txt" -q || + { + rm -rf "$TMP_FOLDER" + echo "---> Error: Python3 is required" + exit 1 + } + + cd "$LAMBDA_STAGING_FOLDER" || exit 1 # change directory into staging folder + if [ "$lambda_folder_count" -gt "1" ]; then + LAMBDA_ZIP_FILE="$STAGING_LAMBDA_FOLDER/$SOLUTION_NAME-$lambda_dir.zip" + else + LAMBDA_ZIP_FILE="$STAGING_LAMBDA_FOLDER/$SOLUTION_NAME.zip" + fi + rm -f "$LAMBDA_ZIP_FILE" # remove zip file, if exists + + # create zip file in the dist folder + echo "...Creating zip file from the temp folder contents" + cd "$TMP_FOLDER" || exit 1 # changed directory to temp folder + zip -r -q "$LAMBDA_ZIP_FILE" . -x "*.DS_Store" -x "inline_*" || + 7z a -tzip "$LAMBDA_ZIP_FILE" || + { + echo "---> ERROR: Zip and 7zip are not available. Manually create the zip file with the $STAGING_LAMBDA_FOLDER folder contents." + exit 1 + } # zip source with packages + cd "$HERE" || exit 1 # change directory to the original directory + + echo "...Removing Temporary Folder $TMP_FOLDER" + rm -rf "$TMP_FOLDER" + else + echo "---> ERROR: Lambda folder '$lambda_dir' does not have any python files and a requirements.txt file" + fi + done + + if [[ "$STAGING_BUCKET" != "none" ]]; then + + # Upload CloudFormation templates to S3 Staging Bucket + if aws s3 cp "$STAGING_TEMPLATES_FOLDER/" s3://"$STAGING_BUCKET/$TEMPLATES_S3_PREFIX/" --recursive --exclude "*" --include "*.yaml" 2>&1 | grep -q "failed"; then + echo "---> ERROR: CloudFormation templates upload to S3 staging bucket failed" + else + echo "...CloudFormation templates uploaded to $STAGING_BUCKET/$SOLUTION_NAME/templates/" + fi + + # upload the lambda zip file to S3 + if aws s3 cp "$STAGING_LAMBDA_FOLDER/" s3://"$STAGING_BUCKET/$LAMBDA_S3_PREFIX/" --recursive --exclude "*" --include "*.zip" 2>&1 | grep -q "failed"; then + echo "---> ERROR: S3 upload failed. Manually upload the Lambda zip files from the staging folder: $STAGING_LAMBDA_FOLDER" + else + echo "...Uploaded Lambda zip files to $STAGING_BUCKET/$LAMBDA_S3_PREFIX/" + fi + + cd "$STAGING_LAMBDA_FOLDER" || exit 1 + for filename in *.zip; do + lambda_name="${filename%.zip}" + + if aws lambda get-function --function-name "$lambda_name" 2>&1 | grep -q "ResourceNotFoundException"; then + echo "...Lambda function $lambda_name not found to update" + else + # update Lambda code + if aws lambda update-function-code --function-name "$lambda_name" --s3-key "$LAMBDA_S3_PREFIX/$filename" --s3-bucket "$STAGING_BUCKET" 2>&1 | grep -q "error"; then + echo "---> ERROR: Lambda update failed" + else + echo "...Lambda function $lambda_name updated" + fi + fi + done + + cd "$HERE" || exit 1 # return to the calling directory + fi + + if [[ "$STAGING_BUCKET" != "none" ]]; then + echo "### SRA STAGING S3 BUCKET NAME: $STAGING_BUCKET" + fi + echo "### SRA STAGING UPLOADS FOLDER: $STAGING_FOLDER" + echo "### CLOUDFORMATION TEMPLATES FOLDER: $TEMPLATES_S3_PREFIX" + echo "### S3 LAMBDA CODE FOLDER: $LAMBDA_S3_PREFIX" + # echo "### LAMBDA ZIP FILE: $SOLUTION_NAME.zip" + # cd "$STAGING_LAMBDA_FOLDER" || exit 1 + # echo -e "### LAMBDA ZIP FILE SIZE: $(du -sh)" + cd "$HERE" || exit 1 # return to the calling directory +else + echo "$usage" +fi + +exit 0 diff --git a/poetry.lock b/poetry.lock index 1f3943e9..288624f8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -66,7 +66,7 @@ stevedore = ">=1.20.0" [[package]] name = "black" -version = "21.11b1" +version = "21.12b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -77,7 +77,6 @@ click = ">=7.1.2" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0,<1" platformdirs = ">=2" -regex = ">=2021.4.4" tomli = ">=0.2.6,<2.0.0" typing-extensions = [ {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, @@ -93,14 +92,14 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.20.10" +version = "1.20.23" description = "The AWS SDK for Python" category = "main" optional = false python-versions = ">= 3.6" [package.dependencies] -botocore = ">=1.23.10,<1.24.0" +botocore = ">=1.23.23,<1.24.0" jmespath = ">=0.7.1,<1.0.0" s3transfer = ">=0.5.0,<0.6.0" @@ -109,8 +108,8 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.20.10" -description = "Type annotations for boto3 1.20.10, generated by mypy-boto3-builder 6.2.1" +version = "1.20.23" +description = "Type annotations for boto3 1.20.23, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -125,6 +124,7 @@ mypy-boto3-alexaforbusiness = {version = ">=1.20.0", optional = true, markers = mypy-boto3-amp = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-amplify = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-amplifybackend = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} +mypy-boto3-amplifyuibuilder = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-apigateway = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-apigatewaymanagementapi = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-apigatewayv2 = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} @@ -144,6 +144,7 @@ mypy-boto3-auditmanager = {version = ">=1.20.0", optional = true, markers = "ext mypy-boto3-autoscaling = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-autoscaling-plans = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-backup = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} +mypy-boto3-backup-gateway = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-batch = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-braket = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-budgets = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} @@ -220,6 +221,7 @@ mypy-boto3-emr = {version = ">=1.20.0", optional = true, markers = "extra == \"a mypy-boto3-emr-containers = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-es = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-events = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} +mypy-boto3-evidently = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-finspace = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-finspace-data = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-firehose = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} @@ -246,6 +248,7 @@ mypy-boto3-identitystore = {version = ">=1.20.0", optional = true, markers = "ex mypy-boto3-imagebuilder = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-importexport = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-inspector = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} +mypy-boto3-inspector2 = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-iot = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-iot-data = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-iot-jobs-data = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} @@ -259,6 +262,7 @@ mypy-boto3-iotfleethub = {version = ">=1.20.0", optional = true, markers = "extr mypy-boto3-iotsecuretunneling = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-iotsitewise = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-iotthingsgraph = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} +mypy-boto3-iottwinmaker = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-iotwireless = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-ivs = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-kafka = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} @@ -304,6 +308,7 @@ mypy-boto3-memorydb = {version = ">=1.20.0", optional = true, markers = "extra = mypy-boto3-meteringmarketplace = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-mgh = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-mgn = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} +mypy-boto3-migration-hub-refactor-spaces = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-migrationhub-config = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-migrationhubstrategy = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-mobile = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} @@ -334,6 +339,7 @@ mypy-boto3-qldb = {version = ">=1.20.0", optional = true, markers = "extra == \" mypy-boto3-qldb-session = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-quicksight = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-ram = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} +mypy-boto3-rbin = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-rds = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-rds-data = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-redshift = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} @@ -349,6 +355,7 @@ mypy-boto3-route53-recovery-control-config = {version = ">=1.20.0", optional = t mypy-boto3-route53-recovery-readiness = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-route53domains = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-route53resolver = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} +mypy-boto3-rum = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-s3 = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-s3control = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-s3outposts = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} @@ -406,6 +413,7 @@ mypy-boto3-worklink = {version = ">=1.20.0", optional = true, markers = "extra = mypy-boto3-workmail = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-workmailmessageflow = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-workspaces = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} +mypy-boto3-workspaces-web = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} mypy-boto3-xray = {version = ">=1.20.0", optional = true, markers = "extra == \"all\""} [package.extras] @@ -414,10 +422,11 @@ account = ["mypy-boto3-account (>=1.20.0)"] acm = ["mypy-boto3-acm (>=1.20.0)"] acm-pca = ["mypy-boto3-acm-pca (>=1.20.0)"] alexaforbusiness = ["mypy-boto3-alexaforbusiness (>=1.20.0)"] -all = ["mypy-boto3-accessanalyzer (>=1.20.0)", "mypy-boto3-account (>=1.20.0)", "mypy-boto3-acm (>=1.20.0)", "mypy-boto3-acm-pca (>=1.20.0)", "mypy-boto3-alexaforbusiness (>=1.20.0)", "mypy-boto3-amp (>=1.20.0)", "mypy-boto3-amplify (>=1.20.0)", "mypy-boto3-amplifybackend (>=1.20.0)", "mypy-boto3-apigateway (>=1.20.0)", "mypy-boto3-apigatewaymanagementapi (>=1.20.0)", "mypy-boto3-apigatewayv2 (>=1.20.0)", "mypy-boto3-appconfig (>=1.20.0)", "mypy-boto3-appconfigdata (>=1.20.0)", "mypy-boto3-appflow (>=1.20.0)", "mypy-boto3-appintegrations (>=1.20.0)", "mypy-boto3-application-autoscaling (>=1.20.0)", "mypy-boto3-application-insights (>=1.20.0)", "mypy-boto3-applicationcostprofiler (>=1.20.0)", "mypy-boto3-appmesh (>=1.20.0)", "mypy-boto3-apprunner (>=1.20.0)", "mypy-boto3-appstream (>=1.20.0)", "mypy-boto3-appsync (>=1.20.0)", "mypy-boto3-athena (>=1.20.0)", "mypy-boto3-auditmanager (>=1.20.0)", "mypy-boto3-autoscaling (>=1.20.0)", "mypy-boto3-autoscaling-plans (>=1.20.0)", "mypy-boto3-backup (>=1.20.0)", "mypy-boto3-batch (>=1.20.0)", "mypy-boto3-braket (>=1.20.0)", "mypy-boto3-budgets (>=1.20.0)", "mypy-boto3-ce (>=1.20.0)", "mypy-boto3-chime (>=1.20.0)", "mypy-boto3-chime-sdk-identity (>=1.20.0)", "mypy-boto3-chime-sdk-meetings (>=1.20.0)", "mypy-boto3-chime-sdk-messaging (>=1.20.0)", "mypy-boto3-cloud9 (>=1.20.0)", "mypy-boto3-cloudcontrol (>=1.20.0)", "mypy-boto3-clouddirectory (>=1.20.0)", "mypy-boto3-cloudformation (>=1.20.0)", "mypy-boto3-cloudfront (>=1.20.0)", "mypy-boto3-cloudhsm (>=1.20.0)", "mypy-boto3-cloudhsmv2 (>=1.20.0)", "mypy-boto3-cloudsearch (>=1.20.0)", "mypy-boto3-cloudsearchdomain (>=1.20.0)", "mypy-boto3-cloudtrail (>=1.20.0)", "mypy-boto3-cloudwatch (>=1.20.0)", "mypy-boto3-codeartifact (>=1.20.0)", "mypy-boto3-codebuild (>=1.20.0)", "mypy-boto3-codecommit (>=1.20.0)", "mypy-boto3-codedeploy (>=1.20.0)", "mypy-boto3-codeguru-reviewer (>=1.20.0)", "mypy-boto3-codeguruprofiler (>=1.20.0)", "mypy-boto3-codepipeline (>=1.20.0)", "mypy-boto3-codestar (>=1.20.0)", "mypy-boto3-codestar-connections (>=1.20.0)", "mypy-boto3-codestar-notifications (>=1.20.0)", "mypy-boto3-cognito-identity (>=1.20.0)", "mypy-boto3-cognito-idp (>=1.20.0)", "mypy-boto3-cognito-sync (>=1.20.0)", "mypy-boto3-comprehend (>=1.20.0)", "mypy-boto3-comprehendmedical (>=1.20.0)", "mypy-boto3-compute-optimizer (>=1.20.0)", "mypy-boto3-config (>=1.20.0)", "mypy-boto3-connect (>=1.20.0)", "mypy-boto3-connect-contact-lens (>=1.20.0)", "mypy-boto3-connectparticipant (>=1.20.0)", "mypy-boto3-cur (>=1.20.0)", "mypy-boto3-customer-profiles (>=1.20.0)", "mypy-boto3-databrew (>=1.20.0)", "mypy-boto3-dataexchange (>=1.20.0)", "mypy-boto3-datapipeline (>=1.20.0)", "mypy-boto3-datasync (>=1.20.0)", "mypy-boto3-dax (>=1.20.0)", "mypy-boto3-detective (>=1.20.0)", "mypy-boto3-devicefarm (>=1.20.0)", "mypy-boto3-devops-guru (>=1.20.0)", "mypy-boto3-directconnect (>=1.20.0)", "mypy-boto3-discovery (>=1.20.0)", "mypy-boto3-dlm (>=1.20.0)", "mypy-boto3-dms (>=1.20.0)", "mypy-boto3-docdb (>=1.20.0)", "mypy-boto3-drs (>=1.20.0)", "mypy-boto3-ds (>=1.20.0)", "mypy-boto3-dynamodb (>=1.20.0)", "mypy-boto3-dynamodbstreams (>=1.20.0)", "mypy-boto3-ebs (>=1.20.0)", "mypy-boto3-ec2 (>=1.20.0)", "mypy-boto3-ec2-instance-connect (>=1.20.0)", "mypy-boto3-ecr (>=1.20.0)", "mypy-boto3-ecr-public (>=1.20.0)", "mypy-boto3-ecs (>=1.20.0)", "mypy-boto3-efs (>=1.20.0)", "mypy-boto3-eks (>=1.20.0)", "mypy-boto3-elastic-inference (>=1.20.0)", "mypy-boto3-elasticache (>=1.20.0)", "mypy-boto3-elasticbeanstalk (>=1.20.0)", "mypy-boto3-elastictranscoder (>=1.20.0)", "mypy-boto3-elb (>=1.20.0)", "mypy-boto3-elbv2 (>=1.20.0)", "mypy-boto3-emr (>=1.20.0)", "mypy-boto3-emr-containers (>=1.20.0)", "mypy-boto3-es (>=1.20.0)", "mypy-boto3-events (>=1.20.0)", "mypy-boto3-finspace (>=1.20.0)", "mypy-boto3-finspace-data (>=1.20.0)", "mypy-boto3-firehose (>=1.20.0)", "mypy-boto3-fis (>=1.20.0)", "mypy-boto3-fms (>=1.20.0)", "mypy-boto3-forecast (>=1.20.0)", "mypy-boto3-forecastquery (>=1.20.0)", "mypy-boto3-frauddetector (>=1.20.0)", "mypy-boto3-fsx (>=1.20.0)", "mypy-boto3-gamelift (>=1.20.0)", "mypy-boto3-glacier (>=1.20.0)", "mypy-boto3-globalaccelerator (>=1.20.0)", "mypy-boto3-glue (>=1.20.0)", "mypy-boto3-grafana (>=1.20.0)", "mypy-boto3-greengrass (>=1.20.0)", "mypy-boto3-greengrassv2 (>=1.20.0)", "mypy-boto3-groundstation (>=1.20.0)", "mypy-boto3-guardduty (>=1.20.0)", "mypy-boto3-health (>=1.20.0)", "mypy-boto3-healthlake (>=1.20.0)", "mypy-boto3-honeycode (>=1.20.0)", "mypy-boto3-iam (>=1.20.0)", "mypy-boto3-identitystore (>=1.20.0)", "mypy-boto3-imagebuilder (>=1.20.0)", "mypy-boto3-importexport (>=1.20.0)", "mypy-boto3-inspector (>=1.20.0)", "mypy-boto3-iot (>=1.20.0)", "mypy-boto3-iot-data (>=1.20.0)", "mypy-boto3-iot-jobs-data (>=1.20.0)", "mypy-boto3-iot1click-devices (>=1.20.0)", "mypy-boto3-iot1click-projects (>=1.20.0)", "mypy-boto3-iotanalytics (>=1.20.0)", "mypy-boto3-iotdeviceadvisor (>=1.20.0)", "mypy-boto3-iotevents (>=1.20.0)", "mypy-boto3-iotevents-data (>=1.20.0)", "mypy-boto3-iotfleethub (>=1.20.0)", "mypy-boto3-iotsecuretunneling (>=1.20.0)", "mypy-boto3-iotsitewise (>=1.20.0)", "mypy-boto3-iotthingsgraph (>=1.20.0)", "mypy-boto3-iotwireless (>=1.20.0)", "mypy-boto3-ivs (>=1.20.0)", "mypy-boto3-kafka (>=1.20.0)", "mypy-boto3-kafkaconnect (>=1.20.0)", "mypy-boto3-kendra (>=1.20.0)", "mypy-boto3-kinesis (>=1.20.0)", "mypy-boto3-kinesis-video-archived-media (>=1.20.0)", "mypy-boto3-kinesis-video-media (>=1.20.0)", "mypy-boto3-kinesis-video-signaling (>=1.20.0)", "mypy-boto3-kinesisanalytics (>=1.20.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.20.0)", "mypy-boto3-kinesisvideo (>=1.20.0)", "mypy-boto3-kms (>=1.20.0)", "mypy-boto3-lakeformation (>=1.20.0)", "mypy-boto3-lambda (>=1.20.0)", "mypy-boto3-lex-models (>=1.20.0)", "mypy-boto3-lex-runtime (>=1.20.0)", "mypy-boto3-lexv2-models (>=1.20.0)", "mypy-boto3-lexv2-runtime (>=1.20.0)", "mypy-boto3-license-manager (>=1.20.0)", "mypy-boto3-lightsail (>=1.20.0)", "mypy-boto3-location (>=1.20.0)", "mypy-boto3-logs (>=1.20.0)", "mypy-boto3-lookoutequipment (>=1.20.0)", "mypy-boto3-lookoutmetrics (>=1.20.0)", "mypy-boto3-lookoutvision (>=1.20.0)", "mypy-boto3-machinelearning (>=1.20.0)", "mypy-boto3-macie (>=1.20.0)", "mypy-boto3-macie2 (>=1.20.0)", "mypy-boto3-managedblockchain (>=1.20.0)", "mypy-boto3-marketplace-catalog (>=1.20.0)", "mypy-boto3-marketplace-entitlement (>=1.20.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.20.0)", "mypy-boto3-mediaconnect (>=1.20.0)", "mypy-boto3-mediaconvert (>=1.20.0)", "mypy-boto3-medialive (>=1.20.0)", "mypy-boto3-mediapackage (>=1.20.0)", "mypy-boto3-mediapackage-vod (>=1.20.0)", "mypy-boto3-mediastore (>=1.20.0)", "mypy-boto3-mediastore-data (>=1.20.0)", "mypy-boto3-mediatailor (>=1.20.0)", "mypy-boto3-memorydb (>=1.20.0)", "mypy-boto3-meteringmarketplace (>=1.20.0)", "mypy-boto3-mgh (>=1.20.0)", "mypy-boto3-mgn (>=1.20.0)", "mypy-boto3-migrationhub-config (>=1.20.0)", "mypy-boto3-migrationhubstrategy (>=1.20.0)", "mypy-boto3-mobile (>=1.20.0)", "mypy-boto3-mq (>=1.20.0)", "mypy-boto3-mturk (>=1.20.0)", "mypy-boto3-mwaa (>=1.20.0)", "mypy-boto3-neptune (>=1.20.0)", "mypy-boto3-network-firewall (>=1.20.0)", "mypy-boto3-networkmanager (>=1.20.0)", "mypy-boto3-nimble (>=1.20.0)", "mypy-boto3-opensearch (>=1.20.0)", "mypy-boto3-opsworks (>=1.20.0)", "mypy-boto3-opsworkscm (>=1.20.0)", "mypy-boto3-organizations (>=1.20.0)", "mypy-boto3-outposts (>=1.20.0)", "mypy-boto3-panorama (>=1.20.0)", "mypy-boto3-personalize (>=1.20.0)", "mypy-boto3-personalize-events (>=1.20.0)", "mypy-boto3-personalize-runtime (>=1.20.0)", "mypy-boto3-pi (>=1.20.0)", "mypy-boto3-pinpoint (>=1.20.0)", "mypy-boto3-pinpoint-email (>=1.20.0)", "mypy-boto3-pinpoint-sms-voice (>=1.20.0)", "mypy-boto3-polly (>=1.20.0)", "mypy-boto3-pricing (>=1.20.0)", "mypy-boto3-proton (>=1.20.0)", "mypy-boto3-qldb (>=1.20.0)", "mypy-boto3-qldb-session (>=1.20.0)", "mypy-boto3-quicksight (>=1.20.0)", "mypy-boto3-ram (>=1.20.0)", "mypy-boto3-rds (>=1.20.0)", "mypy-boto3-rds-data (>=1.20.0)", "mypy-boto3-redshift (>=1.20.0)", "mypy-boto3-redshift-data (>=1.20.0)", "mypy-boto3-rekognition (>=1.20.0)", "mypy-boto3-resiliencehub (>=1.20.0)", "mypy-boto3-resource-groups (>=1.20.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.20.0)", "mypy-boto3-robomaker (>=1.20.0)", "mypy-boto3-route53 (>=1.20.0)", "mypy-boto3-route53-recovery-cluster (>=1.20.0)", "mypy-boto3-route53-recovery-control-config (>=1.20.0)", "mypy-boto3-route53-recovery-readiness (>=1.20.0)", "mypy-boto3-route53domains (>=1.20.0)", "mypy-boto3-route53resolver (>=1.20.0)", "mypy-boto3-s3 (>=1.20.0)", "mypy-boto3-s3control (>=1.20.0)", "mypy-boto3-s3outposts (>=1.20.0)", "mypy-boto3-sagemaker (>=1.20.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.20.0)", "mypy-boto3-sagemaker-edge (>=1.20.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.20.0)", "mypy-boto3-sagemaker-runtime (>=1.20.0)", "mypy-boto3-savingsplans (>=1.20.0)", "mypy-boto3-schemas (>=1.20.0)", "mypy-boto3-sdb (>=1.20.0)", "mypy-boto3-secretsmanager (>=1.20.0)", "mypy-boto3-securityhub (>=1.20.0)", "mypy-boto3-serverlessrepo (>=1.20.0)", "mypy-boto3-service-quotas (>=1.20.0)", "mypy-boto3-servicecatalog (>=1.20.0)", "mypy-boto3-servicecatalog-appregistry (>=1.20.0)", "mypy-boto3-servicediscovery (>=1.20.0)", "mypy-boto3-ses (>=1.20.0)", "mypy-boto3-sesv2 (>=1.20.0)", "mypy-boto3-shield (>=1.20.0)", "mypy-boto3-signer (>=1.20.0)", "mypy-boto3-sms (>=1.20.0)", "mypy-boto3-sms-voice (>=1.20.0)", "mypy-boto3-snow-device-management (>=1.20.0)", "mypy-boto3-snowball (>=1.20.0)", "mypy-boto3-sns (>=1.20.0)", "mypy-boto3-sqs (>=1.20.0)", "mypy-boto3-ssm (>=1.20.0)", "mypy-boto3-ssm-contacts (>=1.20.0)", "mypy-boto3-ssm-incidents (>=1.20.0)", "mypy-boto3-sso (>=1.20.0)", "mypy-boto3-sso-admin (>=1.20.0)", "mypy-boto3-sso-oidc (>=1.20.0)", "mypy-boto3-stepfunctions (>=1.20.0)", "mypy-boto3-storagegateway (>=1.20.0)", "mypy-boto3-sts (>=1.20.0)", "mypy-boto3-support (>=1.20.0)", "mypy-boto3-swf (>=1.20.0)", "mypy-boto3-synthetics (>=1.20.0)", "mypy-boto3-textract (>=1.20.0)", "mypy-boto3-timestream-query (>=1.20.0)", "mypy-boto3-timestream-write (>=1.20.0)", "mypy-boto3-transcribe (>=1.20.0)", "mypy-boto3-transfer (>=1.20.0)", "mypy-boto3-translate (>=1.20.0)", "mypy-boto3-voice-id (>=1.20.0)", "mypy-boto3-waf (>=1.20.0)", "mypy-boto3-waf-regional (>=1.20.0)", "mypy-boto3-wafv2 (>=1.20.0)", "mypy-boto3-wellarchitected (>=1.20.0)", "mypy-boto3-wisdom (>=1.20.0)", "mypy-boto3-workdocs (>=1.20.0)", "mypy-boto3-worklink (>=1.20.0)", "mypy-boto3-workmail (>=1.20.0)", "mypy-boto3-workmailmessageflow (>=1.20.0)", "mypy-boto3-workspaces (>=1.20.0)", "mypy-boto3-xray (>=1.20.0)"] +all = ["mypy-boto3-accessanalyzer (>=1.20.0)", "mypy-boto3-account (>=1.20.0)", "mypy-boto3-acm (>=1.20.0)", "mypy-boto3-acm-pca (>=1.20.0)", "mypy-boto3-alexaforbusiness (>=1.20.0)", "mypy-boto3-amp (>=1.20.0)", "mypy-boto3-amplify (>=1.20.0)", "mypy-boto3-amplifybackend (>=1.20.0)", "mypy-boto3-amplifyuibuilder (>=1.20.0)", "mypy-boto3-apigateway (>=1.20.0)", "mypy-boto3-apigatewaymanagementapi (>=1.20.0)", "mypy-boto3-apigatewayv2 (>=1.20.0)", "mypy-boto3-appconfig (>=1.20.0)", "mypy-boto3-appconfigdata (>=1.20.0)", "mypy-boto3-appflow (>=1.20.0)", "mypy-boto3-appintegrations (>=1.20.0)", "mypy-boto3-application-autoscaling (>=1.20.0)", "mypy-boto3-application-insights (>=1.20.0)", "mypy-boto3-applicationcostprofiler (>=1.20.0)", "mypy-boto3-appmesh (>=1.20.0)", "mypy-boto3-apprunner (>=1.20.0)", "mypy-boto3-appstream (>=1.20.0)", "mypy-boto3-appsync (>=1.20.0)", "mypy-boto3-athena (>=1.20.0)", "mypy-boto3-auditmanager (>=1.20.0)", "mypy-boto3-autoscaling (>=1.20.0)", "mypy-boto3-autoscaling-plans (>=1.20.0)", "mypy-boto3-backup (>=1.20.0)", "mypy-boto3-backup-gateway (>=1.20.0)", "mypy-boto3-batch (>=1.20.0)", "mypy-boto3-braket (>=1.20.0)", "mypy-boto3-budgets (>=1.20.0)", "mypy-boto3-ce (>=1.20.0)", "mypy-boto3-chime (>=1.20.0)", "mypy-boto3-chime-sdk-identity (>=1.20.0)", "mypy-boto3-chime-sdk-meetings (>=1.20.0)", "mypy-boto3-chime-sdk-messaging (>=1.20.0)", "mypy-boto3-cloud9 (>=1.20.0)", "mypy-boto3-cloudcontrol (>=1.20.0)", "mypy-boto3-clouddirectory (>=1.20.0)", "mypy-boto3-cloudformation (>=1.20.0)", "mypy-boto3-cloudfront (>=1.20.0)", "mypy-boto3-cloudhsm (>=1.20.0)", "mypy-boto3-cloudhsmv2 (>=1.20.0)", "mypy-boto3-cloudsearch (>=1.20.0)", "mypy-boto3-cloudsearchdomain (>=1.20.0)", "mypy-boto3-cloudtrail (>=1.20.0)", "mypy-boto3-cloudwatch (>=1.20.0)", "mypy-boto3-codeartifact (>=1.20.0)", "mypy-boto3-codebuild (>=1.20.0)", "mypy-boto3-codecommit (>=1.20.0)", "mypy-boto3-codedeploy (>=1.20.0)", "mypy-boto3-codeguru-reviewer (>=1.20.0)", "mypy-boto3-codeguruprofiler (>=1.20.0)", "mypy-boto3-codepipeline (>=1.20.0)", "mypy-boto3-codestar (>=1.20.0)", "mypy-boto3-codestar-connections (>=1.20.0)", "mypy-boto3-codestar-notifications (>=1.20.0)", "mypy-boto3-cognito-identity (>=1.20.0)", "mypy-boto3-cognito-idp (>=1.20.0)", "mypy-boto3-cognito-sync (>=1.20.0)", "mypy-boto3-comprehend (>=1.20.0)", "mypy-boto3-comprehendmedical (>=1.20.0)", "mypy-boto3-compute-optimizer (>=1.20.0)", "mypy-boto3-config (>=1.20.0)", "mypy-boto3-connect (>=1.20.0)", "mypy-boto3-connect-contact-lens (>=1.20.0)", "mypy-boto3-connectparticipant (>=1.20.0)", "mypy-boto3-cur (>=1.20.0)", "mypy-boto3-customer-profiles (>=1.20.0)", "mypy-boto3-databrew (>=1.20.0)", "mypy-boto3-dataexchange (>=1.20.0)", "mypy-boto3-datapipeline (>=1.20.0)", "mypy-boto3-datasync (>=1.20.0)", "mypy-boto3-dax (>=1.20.0)", "mypy-boto3-detective (>=1.20.0)", "mypy-boto3-devicefarm (>=1.20.0)", "mypy-boto3-devops-guru (>=1.20.0)", "mypy-boto3-directconnect (>=1.20.0)", "mypy-boto3-discovery (>=1.20.0)", "mypy-boto3-dlm (>=1.20.0)", "mypy-boto3-dms (>=1.20.0)", "mypy-boto3-docdb (>=1.20.0)", "mypy-boto3-drs (>=1.20.0)", "mypy-boto3-ds (>=1.20.0)", "mypy-boto3-dynamodb (>=1.20.0)", "mypy-boto3-dynamodbstreams (>=1.20.0)", "mypy-boto3-ebs (>=1.20.0)", "mypy-boto3-ec2 (>=1.20.0)", "mypy-boto3-ec2-instance-connect (>=1.20.0)", "mypy-boto3-ecr (>=1.20.0)", "mypy-boto3-ecr-public (>=1.20.0)", "mypy-boto3-ecs (>=1.20.0)", "mypy-boto3-efs (>=1.20.0)", "mypy-boto3-eks (>=1.20.0)", "mypy-boto3-elastic-inference (>=1.20.0)", "mypy-boto3-elasticache (>=1.20.0)", "mypy-boto3-elasticbeanstalk (>=1.20.0)", "mypy-boto3-elastictranscoder (>=1.20.0)", "mypy-boto3-elb (>=1.20.0)", "mypy-boto3-elbv2 (>=1.20.0)", "mypy-boto3-emr (>=1.20.0)", "mypy-boto3-emr-containers (>=1.20.0)", "mypy-boto3-es (>=1.20.0)", "mypy-boto3-events (>=1.20.0)", "mypy-boto3-evidently (>=1.20.0)", "mypy-boto3-finspace (>=1.20.0)", "mypy-boto3-finspace-data (>=1.20.0)", "mypy-boto3-firehose (>=1.20.0)", "mypy-boto3-fis (>=1.20.0)", "mypy-boto3-fms (>=1.20.0)", "mypy-boto3-forecast (>=1.20.0)", "mypy-boto3-forecastquery (>=1.20.0)", "mypy-boto3-frauddetector (>=1.20.0)", "mypy-boto3-fsx (>=1.20.0)", "mypy-boto3-gamelift (>=1.20.0)", "mypy-boto3-glacier (>=1.20.0)", "mypy-boto3-globalaccelerator (>=1.20.0)", "mypy-boto3-glue (>=1.20.0)", "mypy-boto3-grafana (>=1.20.0)", "mypy-boto3-greengrass (>=1.20.0)", "mypy-boto3-greengrassv2 (>=1.20.0)", "mypy-boto3-groundstation (>=1.20.0)", "mypy-boto3-guardduty (>=1.20.0)", "mypy-boto3-health (>=1.20.0)", "mypy-boto3-healthlake (>=1.20.0)", "mypy-boto3-honeycode (>=1.20.0)", "mypy-boto3-iam (>=1.20.0)", "mypy-boto3-identitystore (>=1.20.0)", "mypy-boto3-imagebuilder (>=1.20.0)", "mypy-boto3-importexport (>=1.20.0)", "mypy-boto3-inspector (>=1.20.0)", "mypy-boto3-inspector2 (>=1.20.0)", "mypy-boto3-iot (>=1.20.0)", "mypy-boto3-iot-data (>=1.20.0)", "mypy-boto3-iot-jobs-data (>=1.20.0)", "mypy-boto3-iot1click-devices (>=1.20.0)", "mypy-boto3-iot1click-projects (>=1.20.0)", "mypy-boto3-iotanalytics (>=1.20.0)", "mypy-boto3-iotdeviceadvisor (>=1.20.0)", "mypy-boto3-iotevents (>=1.20.0)", "mypy-boto3-iotevents-data (>=1.20.0)", "mypy-boto3-iotfleethub (>=1.20.0)", "mypy-boto3-iotsecuretunneling (>=1.20.0)", "mypy-boto3-iotsitewise (>=1.20.0)", "mypy-boto3-iotthingsgraph (>=1.20.0)", "mypy-boto3-iottwinmaker (>=1.20.0)", "mypy-boto3-iotwireless (>=1.20.0)", "mypy-boto3-ivs (>=1.20.0)", "mypy-boto3-kafka (>=1.20.0)", "mypy-boto3-kafkaconnect (>=1.20.0)", "mypy-boto3-kendra (>=1.20.0)", "mypy-boto3-kinesis (>=1.20.0)", "mypy-boto3-kinesis-video-archived-media (>=1.20.0)", "mypy-boto3-kinesis-video-media (>=1.20.0)", "mypy-boto3-kinesis-video-signaling (>=1.20.0)", "mypy-boto3-kinesisanalytics (>=1.20.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.20.0)", "mypy-boto3-kinesisvideo (>=1.20.0)", "mypy-boto3-kms (>=1.20.0)", "mypy-boto3-lakeformation (>=1.20.0)", "mypy-boto3-lambda (>=1.20.0)", "mypy-boto3-lex-models (>=1.20.0)", "mypy-boto3-lex-runtime (>=1.20.0)", "mypy-boto3-lexv2-models (>=1.20.0)", "mypy-boto3-lexv2-runtime (>=1.20.0)", "mypy-boto3-license-manager (>=1.20.0)", "mypy-boto3-lightsail (>=1.20.0)", "mypy-boto3-location (>=1.20.0)", "mypy-boto3-logs (>=1.20.0)", "mypy-boto3-lookoutequipment (>=1.20.0)", "mypy-boto3-lookoutmetrics (>=1.20.0)", "mypy-boto3-lookoutvision (>=1.20.0)", "mypy-boto3-machinelearning (>=1.20.0)", "mypy-boto3-macie (>=1.20.0)", "mypy-boto3-macie2 (>=1.20.0)", "mypy-boto3-managedblockchain (>=1.20.0)", "mypy-boto3-marketplace-catalog (>=1.20.0)", "mypy-boto3-marketplace-entitlement (>=1.20.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.20.0)", "mypy-boto3-mediaconnect (>=1.20.0)", "mypy-boto3-mediaconvert (>=1.20.0)", "mypy-boto3-medialive (>=1.20.0)", "mypy-boto3-mediapackage (>=1.20.0)", "mypy-boto3-mediapackage-vod (>=1.20.0)", "mypy-boto3-mediastore (>=1.20.0)", "mypy-boto3-mediastore-data (>=1.20.0)", "mypy-boto3-mediatailor (>=1.20.0)", "mypy-boto3-memorydb (>=1.20.0)", "mypy-boto3-meteringmarketplace (>=1.20.0)", "mypy-boto3-mgh (>=1.20.0)", "mypy-boto3-mgn (>=1.20.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.20.0)", "mypy-boto3-migrationhub-config (>=1.20.0)", "mypy-boto3-migrationhubstrategy (>=1.20.0)", "mypy-boto3-mobile (>=1.20.0)", "mypy-boto3-mq (>=1.20.0)", "mypy-boto3-mturk (>=1.20.0)", "mypy-boto3-mwaa (>=1.20.0)", "mypy-boto3-neptune (>=1.20.0)", "mypy-boto3-network-firewall (>=1.20.0)", "mypy-boto3-networkmanager (>=1.20.0)", "mypy-boto3-nimble (>=1.20.0)", "mypy-boto3-opensearch (>=1.20.0)", "mypy-boto3-opsworks (>=1.20.0)", "mypy-boto3-opsworkscm (>=1.20.0)", "mypy-boto3-organizations (>=1.20.0)", "mypy-boto3-outposts (>=1.20.0)", "mypy-boto3-panorama (>=1.20.0)", "mypy-boto3-personalize (>=1.20.0)", "mypy-boto3-personalize-events (>=1.20.0)", "mypy-boto3-personalize-runtime (>=1.20.0)", "mypy-boto3-pi (>=1.20.0)", "mypy-boto3-pinpoint (>=1.20.0)", "mypy-boto3-pinpoint-email (>=1.20.0)", "mypy-boto3-pinpoint-sms-voice (>=1.20.0)", "mypy-boto3-polly (>=1.20.0)", "mypy-boto3-pricing (>=1.20.0)", "mypy-boto3-proton (>=1.20.0)", "mypy-boto3-qldb (>=1.20.0)", "mypy-boto3-qldb-session (>=1.20.0)", "mypy-boto3-quicksight (>=1.20.0)", "mypy-boto3-ram (>=1.20.0)", "mypy-boto3-rbin (>=1.20.0)", "mypy-boto3-rds (>=1.20.0)", "mypy-boto3-rds-data (>=1.20.0)", "mypy-boto3-redshift (>=1.20.0)", "mypy-boto3-redshift-data (>=1.20.0)", "mypy-boto3-rekognition (>=1.20.0)", "mypy-boto3-resiliencehub (>=1.20.0)", "mypy-boto3-resource-groups (>=1.20.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.20.0)", "mypy-boto3-robomaker (>=1.20.0)", "mypy-boto3-route53 (>=1.20.0)", "mypy-boto3-route53-recovery-cluster (>=1.20.0)", "mypy-boto3-route53-recovery-control-config (>=1.20.0)", "mypy-boto3-route53-recovery-readiness (>=1.20.0)", "mypy-boto3-route53domains (>=1.20.0)", "mypy-boto3-route53resolver (>=1.20.0)", "mypy-boto3-rum (>=1.20.0)", "mypy-boto3-s3 (>=1.20.0)", "mypy-boto3-s3control (>=1.20.0)", "mypy-boto3-s3outposts (>=1.20.0)", "mypy-boto3-sagemaker (>=1.20.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.20.0)", "mypy-boto3-sagemaker-edge (>=1.20.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.20.0)", "mypy-boto3-sagemaker-runtime (>=1.20.0)", "mypy-boto3-savingsplans (>=1.20.0)", "mypy-boto3-schemas (>=1.20.0)", "mypy-boto3-sdb (>=1.20.0)", "mypy-boto3-secretsmanager (>=1.20.0)", "mypy-boto3-securityhub (>=1.20.0)", "mypy-boto3-serverlessrepo (>=1.20.0)", "mypy-boto3-service-quotas (>=1.20.0)", "mypy-boto3-servicecatalog (>=1.20.0)", "mypy-boto3-servicecatalog-appregistry (>=1.20.0)", "mypy-boto3-servicediscovery (>=1.20.0)", "mypy-boto3-ses (>=1.20.0)", "mypy-boto3-sesv2 (>=1.20.0)", "mypy-boto3-shield (>=1.20.0)", "mypy-boto3-signer (>=1.20.0)", "mypy-boto3-sms (>=1.20.0)", "mypy-boto3-sms-voice (>=1.20.0)", "mypy-boto3-snow-device-management (>=1.20.0)", "mypy-boto3-snowball (>=1.20.0)", "mypy-boto3-sns (>=1.20.0)", "mypy-boto3-sqs (>=1.20.0)", "mypy-boto3-ssm (>=1.20.0)", "mypy-boto3-ssm-contacts (>=1.20.0)", "mypy-boto3-ssm-incidents (>=1.20.0)", "mypy-boto3-sso (>=1.20.0)", "mypy-boto3-sso-admin (>=1.20.0)", "mypy-boto3-sso-oidc (>=1.20.0)", "mypy-boto3-stepfunctions (>=1.20.0)", "mypy-boto3-storagegateway (>=1.20.0)", "mypy-boto3-sts (>=1.20.0)", "mypy-boto3-support (>=1.20.0)", "mypy-boto3-swf (>=1.20.0)", "mypy-boto3-synthetics (>=1.20.0)", "mypy-boto3-textract (>=1.20.0)", "mypy-boto3-timestream-query (>=1.20.0)", "mypy-boto3-timestream-write (>=1.20.0)", "mypy-boto3-transcribe (>=1.20.0)", "mypy-boto3-transfer (>=1.20.0)", "mypy-boto3-translate (>=1.20.0)", "mypy-boto3-voice-id (>=1.20.0)", "mypy-boto3-waf (>=1.20.0)", "mypy-boto3-waf-regional (>=1.20.0)", "mypy-boto3-wafv2 (>=1.20.0)", "mypy-boto3-wellarchitected (>=1.20.0)", "mypy-boto3-wisdom (>=1.20.0)", "mypy-boto3-workdocs (>=1.20.0)", "mypy-boto3-worklink (>=1.20.0)", "mypy-boto3-workmail (>=1.20.0)", "mypy-boto3-workmailmessageflow (>=1.20.0)", "mypy-boto3-workspaces (>=1.20.0)", "mypy-boto3-workspaces-web (>=1.20.0)", "mypy-boto3-xray (>=1.20.0)"] amp = ["mypy-boto3-amp (>=1.20.0)"] amplify = ["mypy-boto3-amplify (>=1.20.0)"] amplifybackend = ["mypy-boto3-amplifybackend (>=1.20.0)"] +amplifyuibuilder = ["mypy-boto3-amplifyuibuilder (>=1.20.0)"] apigateway = ["mypy-boto3-apigateway (>=1.20.0)"] apigatewaymanagementapi = ["mypy-boto3-apigatewaymanagementapi (>=1.20.0)"] apigatewayv2 = ["mypy-boto3-apigatewayv2 (>=1.20.0)"] @@ -437,6 +446,7 @@ auditmanager = ["mypy-boto3-auditmanager (>=1.20.0)"] autoscaling = ["mypy-boto3-autoscaling (>=1.20.0)"] autoscaling-plans = ["mypy-boto3-autoscaling-plans (>=1.20.0)"] backup = ["mypy-boto3-backup (>=1.20.0)"] +backup-gateway = ["mypy-boto3-backup-gateway (>=1.20.0)"] batch = ["mypy-boto3-batch (>=1.20.0)"] braket = ["mypy-boto3-braket (>=1.20.0)"] budgets = ["mypy-boto3-budgets (>=1.20.0)"] @@ -514,6 +524,7 @@ emr-containers = ["mypy-boto3-emr-containers (>=1.20.0)"] es = ["mypy-boto3-es (>=1.20.0)"] essential = ["mypy-boto3-cloudformation (>=1.20.0)", "mypy-boto3-dynamodb (>=1.20.0)", "mypy-boto3-ec2 (>=1.20.0)", "mypy-boto3-lambda (>=1.20.0)", "mypy-boto3-rds (>=1.20.0)", "mypy-boto3-s3 (>=1.20.0)", "mypy-boto3-sqs (>=1.20.0)"] events = ["mypy-boto3-events (>=1.20.0)"] +evidently = ["mypy-boto3-evidently (>=1.20.0)"] finspace = ["mypy-boto3-finspace (>=1.20.0)"] finspace-data = ["mypy-boto3-finspace-data (>=1.20.0)"] firehose = ["mypy-boto3-firehose (>=1.20.0)"] @@ -540,6 +551,7 @@ identitystore = ["mypy-boto3-identitystore (>=1.20.0)"] imagebuilder = ["mypy-boto3-imagebuilder (>=1.20.0)"] importexport = ["mypy-boto3-importexport (>=1.20.0)"] inspector = ["mypy-boto3-inspector (>=1.20.0)"] +inspector2 = ["mypy-boto3-inspector2 (>=1.20.0)"] iot = ["mypy-boto3-iot (>=1.20.0)"] iot-data = ["mypy-boto3-iot-data (>=1.20.0)"] iot-jobs-data = ["mypy-boto3-iot-jobs-data (>=1.20.0)"] @@ -553,6 +565,7 @@ iotfleethub = ["mypy-boto3-iotfleethub (>=1.20.0)"] iotsecuretunneling = ["mypy-boto3-iotsecuretunneling (>=1.20.0)"] iotsitewise = ["mypy-boto3-iotsitewise (>=1.20.0)"] iotthingsgraph = ["mypy-boto3-iotthingsgraph (>=1.20.0)"] +iottwinmaker = ["mypy-boto3-iottwinmaker (>=1.20.0)"] iotwireless = ["mypy-boto3-iotwireless (>=1.20.0)"] ivs = ["mypy-boto3-ivs (>=1.20.0)"] kafka = ["mypy-boto3-kafka (>=1.20.0)"] @@ -598,6 +611,7 @@ memorydb = ["mypy-boto3-memorydb (>=1.20.0)"] meteringmarketplace = ["mypy-boto3-meteringmarketplace (>=1.20.0)"] mgh = ["mypy-boto3-mgh (>=1.20.0)"] mgn = ["mypy-boto3-mgn (>=1.20.0)"] +migration-hub-refactor-spaces = ["mypy-boto3-migration-hub-refactor-spaces (>=1.20.0)"] migrationhub-config = ["mypy-boto3-migrationhub-config (>=1.20.0)"] migrationhubstrategy = ["mypy-boto3-migrationhubstrategy (>=1.20.0)"] mobile = ["mypy-boto3-mobile (>=1.20.0)"] @@ -628,6 +642,7 @@ qldb = ["mypy-boto3-qldb (>=1.20.0)"] qldb-session = ["mypy-boto3-qldb-session (>=1.20.0)"] quicksight = ["mypy-boto3-quicksight (>=1.20.0)"] ram = ["mypy-boto3-ram (>=1.20.0)"] +rbin = ["mypy-boto3-rbin (>=1.20.0)"] rds = ["mypy-boto3-rds (>=1.20.0)"] rds-data = ["mypy-boto3-rds-data (>=1.20.0)"] redshift = ["mypy-boto3-redshift (>=1.20.0)"] @@ -643,6 +658,7 @@ route53-recovery-control-config = ["mypy-boto3-route53-recovery-control-config ( route53-recovery-readiness = ["mypy-boto3-route53-recovery-readiness (>=1.20.0)"] route53domains = ["mypy-boto3-route53domains (>=1.20.0)"] route53resolver = ["mypy-boto3-route53resolver (>=1.20.0)"] +rum = ["mypy-boto3-rum (>=1.20.0)"] s3 = ["mypy-boto3-s3 (>=1.20.0)"] s3control = ["mypy-boto3-s3control (>=1.20.0)"] s3outposts = ["mypy-boto3-s3outposts (>=1.20.0)"] @@ -700,11 +716,12 @@ worklink = ["mypy-boto3-worklink (>=1.20.0)"] workmail = ["mypy-boto3-workmail (>=1.20.0)"] workmailmessageflow = ["mypy-boto3-workmailmessageflow (>=1.20.0)"] workspaces = ["mypy-boto3-workspaces (>=1.20.0)"] +workspaces-web = ["mypy-boto3-workspaces-web (>=1.20.0)"] xray = ["mypy-boto3-xray (>=1.20.0)"] [[package]] name = "botocore" -version = "1.23.10" +version = "1.23.23" description = "Low-level, data-driven core of boto 3." category = "main" optional = false @@ -720,8 +737,8 @@ crt = ["awscrt (==0.12.5)"] [[package]] name = "botocore-stubs" -version = "1.23.10" -description = "Type annotations for botocore 1.23.10, generated by mypy-boto3-builder 6.2.1" +version = "1.23.23" +description = "Type annotations for botocore 1.23.23, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -736,7 +753,7 @@ python-versions = "*" [[package]] name = "charset-normalizer" -version = "2.0.7" +version = "2.0.9" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false @@ -798,7 +815,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "coverage" -version = "6.1.2" +version = "6.2" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -892,7 +909,7 @@ pyflakes = ">=2.3.0,<2.4.0" [[package]] name = "flake8-2020" -version = "1.6.0" +version = "1.6.1" description = "flake8 plugin which checks for misuse of `sys.version` or `sys.version_info`" category = "dev" optional = false @@ -947,7 +964,7 @@ flake8 = ">=3.5,<4.0" [[package]] name = "flake8-bugbear" -version = "21.9.2" +version = "21.11.29" description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." category = "dev" optional = false @@ -958,7 +975,7 @@ attrs = ">=19.2.0" flake8 = ">=3.0.0" [package.extras] -dev = ["coverage", "black", "hypothesis", "hypothesmith"] +dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit"] [[package]] name = "flake8-builtins" @@ -1422,7 +1439,7 @@ python-versions = "*" [[package]] name = "more-itertools" -version = "8.11.0" +version = "8.12.0" description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false @@ -1459,8 +1476,8 @@ python2 = ["typed-ast (>=1.4.0,<1.5.0)"] [[package]] name = "mypy-boto3-accessanalyzer" -version = "1.20.1" -description = "Type annotations for boto3.AccessAnalyzer 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.17" +description = "Type annotations for boto3.AccessAnalyzer 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -1521,6 +1538,14 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "mypy-boto3-amplifyuibuilder" +version = "1.20.19" +description = "Type annotations for boto3.AmplifyUIBuilder 1.20.19 service, generated by mypy-boto3-builder 6.2.1" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "mypy-boto3-apigateway" version = "1.20.8" @@ -1627,8 +1652,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-appsync" -version = "1.20.1" -description = "Type annotations for boto3.AppSync 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.21" +description = "Type annotations for boto3.AppSync 1.20.21 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -1651,8 +1676,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-autoscaling" -version = "1.20.1" -description = "Type annotations for boto3.AutoScaling 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.14" +description = "Type annotations for boto3.AutoScaling 1.20.14 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -1667,8 +1692,16 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-backup" -version = "1.20.3" -description = "Type annotations for boto3.Backup 1.20.3 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.12" +description = "Type annotations for boto3.Backup 1.20.12 service, generated by mypy-boto3-builder 6.2.1" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mypy-boto3-backup-gateway" +version = "1.20.17" +description = "Type annotations for boto3.BackupGateway 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -1683,8 +1716,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-braket" -version = "1.20.1" -description = "Type annotations for boto3.Braket 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.11" +description = "Type annotations for boto3.Braket 1.20.11 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -1723,8 +1756,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-chime-sdk-meetings" -version = "1.20.9" -description = "Type annotations for boto3.ChimeSDKMeetings 1.20.9 service, generated by mypy-boto3-builder 6.2.1" +version = "1.20.11" +description = "Type annotations for boto3.ChimeSDKMeetings 1.20.11 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -1763,8 +1796,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-cloudformation" -version = "1.20.10" -description = "Type annotations for boto3.CloudFormation 1.20.10 service, generated by mypy-boto3-builder 6.2.1" +version = "1.20.11" +description = "Type annotations for boto3.CloudFormation 1.20.11 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -1939,16 +1972,16 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-comprehendmedical" -version = "1.20.1" -description = "Type annotations for boto3.ComprehendMedical 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.22" +description = "Type annotations for boto3.ComprehendMedical 1.20.22 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-compute-optimizer" -version = "1.20.1" -description = "Type annotations for boto3.ComputeOptimizer 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.16" +description = "Type annotations for boto3.ComputeOptimizer 1.20.16 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -1963,8 +1996,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-connect" -version = "1.20.5" -description = "Type annotations for boto3.Connect 1.20.5 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.11" +description = "Type annotations for boto3.Connect 1.20.11 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -1995,8 +2028,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-customer-profiles" -version = "1.20.1" -description = "Type annotations for boto3.CustomerProfiles 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.13" +description = "Type annotations for boto3.CustomerProfiles 1.20.13 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2011,8 +2044,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-dataexchange" -version = "1.20.1" -description = "Type annotations for boto3.DataExchange 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.16" +description = "Type annotations for boto3.DataExchange 1.20.16 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2059,16 +2092,16 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-devops-guru" -version = "1.20.5" -description = "Type annotations for boto3.DevOpsGuru 1.20.5 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.18" +description = "Type annotations for boto3.DevOpsGuru 1.20.18 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-directconnect" -version = "1.20.1" -description = "Type annotations for boto3.DirectConnect 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.18" +description = "Type annotations for boto3.DirectConnect 1.20.18 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2091,8 +2124,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-dms" -version = "1.20.6" -description = "Type annotations for boto3.DatabaseMigrationService 1.20.6 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.11" +description = "Type annotations for boto3.DatabaseMigrationService 1.20.11 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2123,8 +2156,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-dynamodb" -version = "1.20.4" -description = "Type annotations for boto3.DynamoDB 1.20.4 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.18" +description = "Type annotations for boto3.DynamoDB 1.20.18 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2147,8 +2180,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-ec2" -version = "1.20.6" -description = "Type annotations for boto3.EC2 1.20.6 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.23" +description = "Type annotations for boto3.EC2 1.20.23 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2163,8 +2196,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-ecr" -version = "1.20.1" -description = "Type annotations for boto3.ECR 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.16" +description = "Type annotations for boto3.ECR 1.20.16 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2179,8 +2212,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-ecs" -version = "1.20.3" -description = "Type annotations for boto3.ECS 1.20.3 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.12" +description = "Type annotations for boto3.ECS 1.20.12 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2195,8 +2228,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-eks" -version = "1.20.6" -description = "Type annotations for boto3.EKS 1.20.6 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.11" +description = "Type annotations for boto3.EKS 1.20.11 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2211,8 +2244,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-elasticache" -version = "1.20.1" -description = "Type annotations for boto3.ElastiCache 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.13" +description = "Type annotations for boto3.ElastiCache 1.20.13 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2243,8 +2276,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-elbv2" -version = "1.20.1" -description = "Type annotations for boto3.ElasticLoadBalancingv2 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.12" +description = "Type annotations for boto3.ElasticLoadBalancingv2 1.20.12 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2267,8 +2300,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-es" -version = "1.20.1" -description = "Type annotations for boto3.ElasticsearchService 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.11" +description = "Type annotations for boto3.ElasticsearchService 1.20.11 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2281,6 +2314,14 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "mypy-boto3-evidently" +version = "1.20.16" +description = "Type annotations for boto3.CloudWatchEvidently 1.20.16 service, generated by mypy-boto3-builder 6.2.1" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "mypy-boto3-finspace" version = "1.20.1" @@ -2291,8 +2332,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-finspace-data" -version = "1.20.1" -description = "Type annotations for boto3.FinSpaceData 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.12" +description = "Type annotations for boto3.FinSpaceData 1.20.12 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2347,8 +2388,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-fsx" -version = "1.20.1" -description = "Type annotations for boto3.FSx 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.17" +description = "Type annotations for boto3.FSx 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2379,8 +2420,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-glue" -version = "1.20.1" -description = "Type annotations for boto3.Glue 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.17" +description = "Type annotations for boto3.Glue 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2427,8 +2468,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-health" -version = "1.20.2" -description = "Type annotations for boto3.Health 1.20.2 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.22" +description = "Type annotations for boto3.Health 1.20.22 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2467,8 +2508,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-imagebuilder" -version = "1.20.1" -description = "Type annotations for boto3.imagebuilder 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.13" +description = "Type annotations for boto3.imagebuilder 1.20.13 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2489,10 +2530,18 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "mypy-boto3-inspector2" +version = "1.20.16" +description = "Type annotations for boto3.Inspector2 1.20.16 service, generated by mypy-boto3-builder 6.2.1" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "mypy-boto3-iot" -version = "1.20.1" -description = "Type annotations for boto3.IoT 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.22" +description = "Type annotations for boto3.IoT 1.20.22 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2539,8 +2588,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-iotdeviceadvisor" -version = "1.20.1" -description = "Type annotations for boto3.IoTDeviceAdvisor 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.14" +description = "Type annotations for boto3.IoTDeviceAdvisor 1.20.14 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2579,8 +2628,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-iotsitewise" -version = "1.20.1" -description = "Type annotations for boto3.IoTSiteWise 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.16" +description = "Type annotations for boto3.IoTSiteWise 1.20.16 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2593,10 +2642,18 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "mypy-boto3-iottwinmaker" +version = "1.20.17" +description = "Type annotations for boto3.IoTTwinMaker 1.20.17 service, generated by mypy-boto3-builder 6.2.1" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "mypy-boto3-iotwireless" -version = "1.20.1" -description = "Type annotations for boto3.IoTWireless 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.12" +description = "Type annotations for boto3.IoTWireless 1.20.12 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2611,8 +2668,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-kafka" -version = "1.20.9" -description = "Type annotations for boto3.Kafka 1.20.9 service, generated by mypy-boto3-builder 6.2.1" +version = "1.20.17" +description = "Type annotations for boto3.Kafka 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2627,16 +2684,16 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-kendra" -version = "1.20.1" -description = "Type annotations for boto3.kendra 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.18" +description = "Type annotations for boto3.kendra 1.20.18 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-kinesis" -version = "1.20.1" -description = "Type annotations for boto3.Kinesis 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.17" +description = "Type annotations for boto3.Kinesis 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2699,16 +2756,16 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-lakeformation" -version = "1.20.1" -description = "Type annotations for boto3.LakeFormation 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.17" +description = "Type annotations for boto3.LakeFormation 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-lambda" -version = "1.20.10" -description = "Type annotations for boto3.Lambda 1.20.10 service, generated by mypy-boto3-builder 6.2.1" +version = "1.20.13" +description = "Type annotations for boto3.Lambda 1.20.13 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2731,8 +2788,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-lexv2-models" -version = "1.20.9" -description = "Type annotations for boto3.LexModelsV2 1.20.9 service, generated by mypy-boto3-builder 6.2.1" +version = "1.20.23" +description = "Type annotations for boto3.LexModelsV2 1.20.23 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2763,16 +2820,16 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-location" -version = "1.20.7" -description = "Type annotations for boto3.LocationService 1.20.7 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.21" +description = "Type annotations for boto3.LocationService 1.20.21 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-logs" -version = "1.20.1" -description = "Type annotations for boto3.CloudWatchLogs 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.22" +description = "Type annotations for boto3.CloudWatchLogs 1.20.22 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2795,8 +2852,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-lookoutvision" -version = "1.20.1" -description = "Type annotations for boto3.LookoutforVision 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.22" +description = "Type annotations for boto3.LookoutforVision 1.20.22 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2819,8 +2876,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-macie2" -version = "1.20.1" -description = "Type annotations for boto3.Macie2 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.12" +description = "Type annotations for boto3.Macie2 1.20.12 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -2947,8 +3004,16 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-mgn" -version = "1.20.1" -description = "Type annotations for boto3.mgn 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.14" +description = "Type annotations for boto3.mgn 1.20.14 service, generated by mypy-boto3-builder 6.2.1" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mypy-boto3-migration-hub-refactor-spaces" +version = "1.20.15" +description = "Type annotations for boto3.MigrationHubRefactorSpaces 1.20.15 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3011,16 +3076,16 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-network-firewall" -version = "1.20.1" -description = "Type annotations for boto3.NetworkFirewall 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.23" +description = "Type annotations for boto3.NetworkFirewall 1.20.23 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-networkmanager" -version = "1.20.1" -description = "Type annotations for boto3.NetworkManager 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.19" +description = "Type annotations for boto3.NetworkManager 1.20.19 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3035,8 +3100,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-opensearch" -version = "1.20.1" -description = "Type annotations for boto3.OpenSearchService 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.12" +description = "Type annotations for boto3.OpenSearchService 1.20.12 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3067,8 +3132,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-outposts" -version = "1.20.1" -description = "Type annotations for boto3.Outposts 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.22" +description = "Type annotations for boto3.Outposts 1.20.22 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3083,8 +3148,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-personalize" -version = "1.20.1" -description = "Type annotations for boto3.Personalize 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.15" +description = "Type annotations for boto3.Personalize 1.20.15 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3099,8 +3164,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-personalize-runtime" -version = "1.20.1" -description = "Type annotations for boto3.PersonalizeRuntime 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.15" +description = "Type annotations for boto3.PersonalizeRuntime 1.20.15 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3115,8 +3180,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-pinpoint" -version = "1.20.1" -description = "Type annotations for boto3.Pinpoint 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.14" +description = "Type annotations for boto3.Pinpoint 1.20.14 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3155,8 +3220,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-proton" -version = "1.20.1" -description = "Type annotations for boto3.Proton 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.13" +description = "Type annotations for boto3.Proton 1.20.13 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3179,24 +3244,32 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-quicksight" -version = "1.20.1" -description = "Type annotations for boto3.QuickSight 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.11" +description = "Type annotations for boto3.QuickSight 1.20.11 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-ram" -version = "1.20.1" -description = "Type annotations for boto3.RAM 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.19" +description = "Type annotations for boto3.RAM 1.20.19 service, generated by mypy-boto3-builder 6.2.1" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mypy-boto3-rbin" +version = "1.20.16" +description = "Type annotations for boto3.RecycleBin 1.20.16 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-rds" -version = "1.20.1" -description = "Type annotations for boto3.RDS 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.12" +description = "Type annotations for boto3.RDS 1.20.12 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3211,24 +3284,24 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-redshift" -version = "1.20.10" -description = "Type annotations for boto3.Redshift 1.20.10 service, generated by mypy-boto3-builder 6.2.1" +version = "1.20.12" +description = "Type annotations for boto3.Redshift 1.20.12 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-redshift-data" -version = "1.20.9" -description = "Type annotations for boto3.RedshiftDataAPIService 1.20.9 service, generated by mypy-boto3-builder 6.2.1" +version = "1.20.17" +description = "Type annotations for boto3.RedshiftDataAPIService 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-rekognition" -version = "1.20.1" -description = "Type annotations for boto3.Rekognition 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.20" +description = "Type annotations for boto3.Rekognition 1.20.20 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3267,8 +3340,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-route53" -version = "1.20.1" -description = "Type annotations for boto3.Route53 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.21" +description = "Type annotations for boto3.Route53 1.20.21 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3283,8 +3356,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-route53-recovery-control-config" -version = "1.20.1" -description = "Type annotations for boto3.Route53RecoveryControlConfig 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.23" +description = "Type annotations for boto3.Route53RecoveryControlConfig 1.20.23 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3299,8 +3372,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-route53domains" -version = "1.20.1" -description = "Type annotations for boto3.Route53Domains 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.23" +description = "Type annotations for boto3.Route53Domains 1.20.23 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3313,18 +3386,26 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "mypy-boto3-rum" +version = "1.20.16" +description = "Type annotations for boto3.CloudWatchRUM 1.20.16 service, generated by mypy-boto3-builder 6.2.1" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "mypy-boto3-s3" -version = "1.20.1" -description = "Type annotations for boto3.S3 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.17" +description = "Type annotations for boto3.S3 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-s3control" -version = "1.20.1" -description = "Type annotations for boto3.S3Control 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.11" +description = "Type annotations for boto3.S3Control 1.20.11 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3339,8 +3420,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-sagemaker" -version = "1.20.1" -description = "Type annotations for boto3.SageMaker 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.22" +description = "Type annotations for boto3.SageMaker 1.20.22 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3371,16 +3452,16 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-sagemaker-runtime" -version = "1.20.1" -description = "Type annotations for boto3.SageMakerRuntime 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.18" +description = "Type annotations for boto3.SageMakerRuntime 1.20.18 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-savingsplans" -version = "1.20.1" -description = "Type annotations for boto3.SavingsPlans 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.23" +description = "Type annotations for boto3.SavingsPlans 1.20.23 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3475,8 +3556,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-shield" -version = "1.20.1" -description = "Type annotations for boto3.Shield 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.18" +description = "Type annotations for boto3.Shield 1.20.18 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3491,8 +3572,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-sms" -version = "1.20.1" -description = "Type annotations for boto3.SMS 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.23" +description = "Type annotations for boto3.SMS 1.20.23 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3515,8 +3596,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-snowball" -version = "1.20.1" -description = "Type annotations for boto3.Snowball 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.17" +description = "Type annotations for boto3.Snowball 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3531,16 +3612,16 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-sqs" -version = "1.20.1" -description = "Type annotations for boto3.SQS 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.12" +description = "Type annotations for boto3.SQS 1.20.12 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-ssm" -version = "1.20.6" -description = "Type annotations for boto3.SSM 1.20.6 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.16" +description = "Type annotations for boto3.SSM 1.20.16 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3595,24 +3676,24 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-storagegateway" -version = "1.20.1" -description = "Type annotations for boto3.StorageGateway 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.17" +description = "Type annotations for boto3.StorageGateway 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-sts" -version = "1.20.1" -description = "Type annotations for boto3.STS 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.12" +description = "Type annotations for boto3.STS 1.20.12 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-support" -version = "1.20.1" -description = "Type annotations for boto3.Support 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.22" +description = "Type annotations for boto3.Support 1.20.22 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3635,24 +3716,24 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-textract" -version = "1.20.1" -description = "Type annotations for boto3.Textract 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.15" +description = "Type annotations for boto3.Textract 1.20.15 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-timestream-query" -version = "1.20.1" -description = "Type annotations for boto3.TimestreamQuery 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.13" +description = "Type annotations for boto3.TimestreamQuery 1.20.13 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy-boto3-timestream-write" -version = "1.20.1" -description = "Type annotations for boto3.TimestreamWrite 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.13" +description = "Type annotations for boto3.TimestreamWrite 1.20.13 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3675,8 +3756,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-translate" -version = "1.20.4" -description = "Type annotations for boto3.Translate 1.20.4 service, generated by mypy-boto3-builder 6.2.0" +version = "1.20.13" +description = "Type annotations for boto3.Translate 1.20.13 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3715,8 +3796,8 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-wellarchitected" -version = "1.20.1" -description = "Type annotations for boto3.WellArchitected 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.16" +description = "Type annotations for boto3.WellArchitected 1.20.16 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3763,8 +3844,16 @@ python-versions = ">=3.6" [[package]] name = "mypy-boto3-workspaces" -version = "1.20.1" -description = "Type annotations for boto3.WorkSpaces 1.20.1 service, generated by mypy-boto3-builder 6.1.2" +version = "1.20.12" +description = "Type annotations for boto3.WorkSpaces 1.20.12 service, generated by mypy-boto3-builder 6.2.1" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mypy-boto3-workspaces-web" +version = "1.20.17" +description = "Type annotations for boto3.WorkSpacesWeb 1.20.17 service, generated by mypy-boto3-builder 6.2.1" category = "dev" optional = false python-versions = ">=3.6" @@ -3904,7 +3993,7 @@ python-versions = "*" [[package]] name = "pylic" -version = "2.1.0" +version = "2.2.0" description = "A Python license checker" category = "dev" optional = false @@ -3965,11 +4054,11 @@ testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtuale [[package]] name = "pytest-forked" -version = "1.3.0" +version = "1.4.0" description = "run tests in isolated forked subprocesses" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] py = "*" @@ -3991,7 +4080,7 @@ dev = ["pre-commit", "tox", "pytest-asyncio"] [[package]] name = "pytest-xdist" -version = "2.4.0" +version = "2.5.0" description = "pytest xdist plugin for distributed testing and loop-on-failing modes" category = "dev" optional = false @@ -3999,7 +4088,7 @@ python-versions = ">=3.6" [package.dependencies] execnet = ">=1.1" -pytest = ">=6.0.0" +pytest = ">=6.2.0" pytest-forked = "*" [package.extras] @@ -4026,14 +4115,6 @@ category = "dev" optional = false python-versions = ">=3.6" -[[package]] -name = "regex" -version = "2021.11.10" -description = "Alternative regular expression module, to replace re." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "requests" version = "2.26.0" @@ -4225,32 +4306,32 @@ bandit = [ {file = "bandit-1.7.1.tar.gz", hash = "sha256:a81b00b5436e6880fa8ad6799bc830e02032047713cbb143a12939ac67eb756c"}, ] black = [ - {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"}, - {file = "black-21.11b1.tar.gz", hash = "sha256:a042adbb18b3262faad5aff4e834ff186bb893f95ba3a8013f09de1e5569def2"}, + {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, + {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, ] boto3 = [ - {file = "boto3-1.20.10-py3-none-any.whl", hash = "sha256:e2b5ce2679424a6c2bfc2ee4bb42d9100c8c08b21eff8d74cff85a7243a76d7b"}, - {file = "boto3-1.20.10.tar.gz", hash = "sha256:20a5109a37414a52c55d2048388f02cb7cf46fc0ca7be08b3bf81f4c5c053feb"}, + {file = "boto3-1.20.23-py3-none-any.whl", hash = "sha256:76b3ee0d1dd860c9218bc864cd29f1ee986f6e1e75e8669725dd3c411039379e"}, + {file = "boto3-1.20.23.tar.gz", hash = "sha256:c39cb6ed376ba1d4689ac8f6759a2b2d8a0b0424dbec0cd3af1558079bcf06e8"}, ] boto3-stubs = [ - {file = "boto3-stubs-1.20.10.tar.gz", hash = "sha256:9983da0f5286f76bcbf057a2763513a960810310dde43c89380977be00248025"}, - {file = "boto3_stubs-1.20.10-py3-none-any.whl", hash = "sha256:826aada2127ea9dba16b5ce359f662d76f3b8d1bbdbfd7049357b20c4f2a1975"}, + {file = "boto3-stubs-1.20.23.tar.gz", hash = "sha256:128388a5e1125983f997c0d00d0ab12fcd3224d6bf90d877ab9ffbfd5968fb80"}, + {file = "boto3_stubs-1.20.23-py3-none-any.whl", hash = "sha256:bffad47acf132cdbaf184a6011d8f71846935bb381a84b30eb6c4d30f7f16376"}, ] botocore = [ - {file = "botocore-1.23.10-py3-none-any.whl", hash = "sha256:11670d3ac14eed1122e0154a7e1563c2c270beef43996466f8d11fbf5cf31611"}, - {file = "botocore-1.23.10.tar.gz", hash = "sha256:0adda9a4a95221027312eaaee0ec9fe2239fb2f285fced3ddca54b1310b864ee"}, + {file = "botocore-1.23.23-py3-none-any.whl", hash = "sha256:7459766c4594f3b8877e8013f93f0dc6c6486acbeb7d9c9ae488396529cc2e84"}, + {file = "botocore-1.23.23.tar.gz", hash = "sha256:640b62110aa6d1c25553eceafb5bcd89aedeb84b191598d1f6492ad24374d285"}, ] botocore-stubs = [ - {file = "botocore-stubs-1.23.10.tar.gz", hash = "sha256:7e24c8b61e0a7f9812a19de90d2098d7ae12bca9dab532761fbf821c4d457f29"}, - {file = "botocore_stubs-1.23.10-py3-none-any.whl", hash = "sha256:c85d2635a01014617f455a2e337e64a8d4786b4c9011726c520b5f6abc839c8e"}, + {file = "botocore-stubs-1.23.23.tar.gz", hash = "sha256:2012967265388cbe62fb507e802cb722a84198acdc48a86d311f845626ea6795"}, + {file = "botocore_stubs-1.23.23-py3-none-any.whl", hash = "sha256:67162f09d491aecbc5e3694061bfe1b13634a9f45048c432f3bda6e398173b29"}, ] certifi = [ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"}, - {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, + {file = "charset-normalizer-2.0.9.tar.gz", hash = "sha256:b0b883e8e874edfdece9c28f314e3dd5badf067342e42fb162203335ae61aa2c"}, + {file = "charset_normalizer-2.0.9-py3-none-any.whl", hash = "sha256:1eecaa09422db5be9e29d7fc65664e6c33bd06f9ced7838578ba40d58bdf3721"}, ] cleo = [ {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, @@ -4272,53 +4353,53 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] coverage = [ - {file = "coverage-6.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:675adb3b3380967806b3cbb9c5b00ceb29b1c472692100a338730c1d3e59c8b9"}, - {file = "coverage-6.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95a58336aa111af54baa451c33266a8774780242cab3704b7698d5e514840758"}, - {file = "coverage-6.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d0a595a781f8e186580ff8e3352dd4953b1944289bec7705377c80c7e36c4d6c"}, - {file = "coverage-6.1.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d3c5f49ce6af61154060640ad3b3281dbc46e2e0ef2fe78414d7f8a324f0b649"}, - {file = "coverage-6.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:310c40bed6b626fd1f463e5a83dba19a61c4eb74e1ac0d07d454ebbdf9047e9d"}, - {file = "coverage-6.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a4d48e42e17d3de212f9af44f81ab73b9378a4b2b8413fd708d0d9023f2bbde4"}, - {file = "coverage-6.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ffa545230ca2ad921ad066bf8fd627e7be43716b6e0fcf8e32af1b8188ccb0ab"}, - {file = "coverage-6.1.2-cp310-cp310-win32.whl", hash = "sha256:cd2d11a59afa5001ff28073ceca24ae4c506da4355aba30d1e7dd2bd0d2206dc"}, - {file = "coverage-6.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:96129e41405887a53a9cc564f960d7f853cc63d178f3a182fdd302e4cab2745b"}, - {file = "coverage-6.1.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1de9c6f5039ee2b1860b7bad2c7bc3651fbeb9368e4c4d93e98a76358cdcb052"}, - {file = "coverage-6.1.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:80cb70264e9a1d04b519cdba3cd0dc42847bf8e982a4d55c769b9b0ee7cdce1e"}, - {file = "coverage-6.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:ba6125d4e55c0b8e913dad27b22722eac7abdcb1f3eab1bd090eee9105660266"}, - {file = "coverage-6.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8492d37acdc07a6eac6489f6c1954026f2260a85a4c2bb1e343fe3d35f5ee21a"}, - {file = "coverage-6.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66af99c7f7b64d050d37e795baadf515b4561124f25aae6e1baa482438ecc388"}, - {file = "coverage-6.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ebcc03e1acef4ff44f37f3c61df478d6e469a573aa688e5a162f85d7e4c3860d"}, - {file = "coverage-6.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98d44a8136eebbf544ad91fef5bd2b20ef0c9b459c65a833c923d9aa4546b204"}, - {file = "coverage-6.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c18725f3cffe96732ef96f3de1939d81215fd6d7d64900dcc4acfe514ea4fcbf"}, - {file = "coverage-6.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c8e9c4bcaaaa932be581b3d8b88b677489975f845f7714efc8cce77568b6711c"}, - {file = "coverage-6.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:06d009e8a29483cbc0520665bc46035ffe9ae0e7484a49f9782c2a716e37d0a0"}, - {file = "coverage-6.1.2-cp36-cp36m-win32.whl", hash = "sha256:e5432d9c329b11c27be45ee5f62cf20a33065d482c8dec1941d6670622a6fb8f"}, - {file = "coverage-6.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:82fdcb64bf08aa5db881db061d96db102c77397a570fbc112e21c48a4d9cb31b"}, - {file = "coverage-6.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:94f558f8555e79c48c422045f252ef41eb43becdd945e9c775b45ebfc0cbd78f"}, - {file = "coverage-6.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046647b96969fda1ae0605f61288635209dd69dcd27ba3ec0bf5148bc157f954"}, - {file = "coverage-6.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cc799916b618ec9fd00135e576424165691fec4f70d7dc12cfaef09268a2478c"}, - {file = "coverage-6.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:62646d98cf0381ffda301a816d6ac6c35fc97aa81b09c4c52d66a15c4bef9d7c"}, - {file = "coverage-6.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:27a3df08a855522dfef8b8635f58bab81341b2fb5f447819bc252da3aa4cf44c"}, - {file = "coverage-6.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:610c0ba11da8de3a753dc4b1f71894f9f9debfdde6559599f303286e70aeb0c2"}, - {file = "coverage-6.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:35b246ae3a2c042dc8f410c94bcb9754b18179cdb81ff9477a9089dbc9ecc186"}, - {file = "coverage-6.1.2-cp37-cp37m-win32.whl", hash = "sha256:0cde7d9fe2fb55ff68ebe7fb319ef188e9b88e0a3d1c9c5db7dd829cd93d2193"}, - {file = "coverage-6.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:958ac66272ff20e63d818627216e3d7412fdf68a2d25787b89a5c6f1eb7fdd93"}, - {file = "coverage-6.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a300b39c3d5905686c75a369d2a66e68fd01472ea42e16b38c948bd02b29e5bd"}, - {file = "coverage-6.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d3855d5d26292539861f5ced2ed042fc2aa33a12f80e487053aed3bcb6ced13"}, - {file = "coverage-6.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:586d38dfc7da4a87f5816b203ff06dd7c1bb5b16211ccaa0e9788a8da2b93696"}, - {file = "coverage-6.1.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a34fccb45f7b2d890183a263578d60a392a1a218fdc12f5bce1477a6a68d4373"}, - {file = "coverage-6.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bc1ee1318f703bc6c971da700d74466e9b86e0c443eb85983fb2a1bd20447263"}, - {file = "coverage-6.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3f546f48d5d80a90a266769aa613bc0719cb3e9c2ef3529d53f463996dd15a9d"}, - {file = "coverage-6.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd92ece726055e80d4e3f01fff3b91f54b18c9c357c48fcf6119e87e2461a091"}, - {file = "coverage-6.1.2-cp38-cp38-win32.whl", hash = "sha256:24ed38ec86754c4d5a706fbd5b52b057c3df87901a8610d7e5642a08ec07087e"}, - {file = "coverage-6.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:97ef6e9119bd39d60ef7b9cd5deea2b34869c9f0b9777450a7e3759c1ab09b9b"}, - {file = "coverage-6.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e5a8c947a2a89c56655ecbb789458a3a8e3b0cbf4c04250331df8f647b3de59"}, - {file = "coverage-6.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a39590d1e6acf6a3c435c5d233f72f5d43b585f5be834cff1f21fec4afda225"}, - {file = "coverage-6.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9d2c2e3ce7b8cc932a2f918186964bd44de8c84e2f9ef72dc616f5bb8be22e71"}, - {file = "coverage-6.1.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3348865798c077c695cae00da0924136bb5cc501f236cfd6b6d9f7a3c94e0ec4"}, - {file = "coverage-6.1.2-cp39-cp39-win32.whl", hash = "sha256:fae3fe111670e51f1ebbc475823899524e3459ea2db2cb88279bbfb2a0b8a3de"}, - {file = "coverage-6.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:af45eea024c0e3a25462fade161afab4f0d9d9e0d5a5d53e86149f74f0a35ecc"}, - {file = "coverage-6.1.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:eab14fdd410500dae50fd14ccc332e65543e7b39f6fc076fe90603a0e5d2f929"}, - {file = "coverage-6.1.2.tar.gz", hash = "sha256:d9a635114b88c0ab462e0355472d00a180a5fbfd8511e7f18e4ac32652e7d972"}, + {file = "coverage-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840"}, + {file = "coverage-6.2-cp310-cp310-win32.whl", hash = "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c"}, + {file = "coverage-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f"}, + {file = "coverage-6.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76"}, + {file = "coverage-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47"}, + {file = "coverage-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64"}, + {file = "coverage-6.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781"}, + {file = "coverage-6.2-cp36-cp36m-win32.whl", hash = "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a"}, + {file = "coverage-6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0"}, + {file = "coverage-6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8"}, + {file = "coverage-6.2-cp37-cp37m-win32.whl", hash = "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4"}, + {file = "coverage-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74"}, + {file = "coverage-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57"}, + {file = "coverage-6.2-cp38-cp38-win32.whl", hash = "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c"}, + {file = "coverage-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2"}, + {file = "coverage-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3"}, + {file = "coverage-6.2-cp39-cp39-win32.whl", hash = "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282"}, + {file = "coverage-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644"}, + {file = "coverage-6.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de"}, + {file = "coverage-6.2.tar.gz", hash = "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8"}, ] crashtest = [ {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, @@ -4351,8 +4432,8 @@ flake8 = [ {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, ] flake8-2020 = [ - {file = "flake8_2020-1.6.0-py2.py3-none-any.whl", hash = "sha256:e464cef7889117e7ae7253e35fcb8272bd8ae68fc10bb3399ef85b036c092528"}, - {file = "flake8_2020-1.6.0.tar.gz", hash = "sha256:3e438d9d531577fbb9332bbd0bf394eca890f3b7a5311e2278fb3582381a2f13"}, + {file = "flake8_2020-1.6.1-py2.py3-none-any.whl", hash = "sha256:efcc056fb723e1ea5307e3b663c7c328f1c23a5ff0a0fd3be695a918d8245c3a"}, + {file = "flake8_2020-1.6.1.tar.gz", hash = "sha256:db523e3383befc17c895219551ff6c9b2f6e0a5cae4c7739ea65a2238bdc6f74"}, ] flake8-annotations-complexity = [ {file = "flake8_annotations_complexity-0.0.6-py3-none-any.whl", hash = "sha256:078a84e8269ef82c4c9de5198638e9a91a2089307d4e559666464a87b528ea69"}, @@ -4370,8 +4451,8 @@ flake8-broken-line = [ {file = "flake8_broken_line-0.3.0-py3-none-any.whl", hash = "sha256:611f79c7f27118e7e5d3dc098ef7681c40aeadf23783700c5dbee840d2baf3af"}, ] flake8-bugbear = [ - {file = "flake8-bugbear-21.9.2.tar.gz", hash = "sha256:db9a09893a6c649a197f5350755100bb1dd84f110e60cf532fdfa07e41808ab2"}, - {file = "flake8_bugbear-21.9.2-py36.py37.py38-none-any.whl", hash = "sha256:4f7eaa6f05b7d7ea4cbbde93f7bcdc5438e79320fa1ec420d860c181af38b769"}, + {file = "flake8-bugbear-21.11.29.tar.gz", hash = "sha256:8b04cb2fafc6a78e1a9d873bd3988e4282f7959bb6b0d7c1ae648ec09b937a7b"}, + {file = "flake8_bugbear-21.11.29-py36.py37.py38-none-any.whl", hash = "sha256:179e41ddae5de5e3c20d1f61736feeb234e70958fbb56ab3c28a67739c8e9a82"}, ] flake8-builtins = [ {file = "flake8-builtins-1.5.3.tar.gz", hash = "sha256:09998853b2405e98e61d2ff3027c47033adbdc17f9fe44ca58443d876eb00f3b"}, @@ -4534,8 +4615,8 @@ mccabe = [ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] more-itertools = [ - {file = "more-itertools-8.11.0.tar.gz", hash = "sha256:0a2fd25d343c08d7e7212071820e7e7ea2f41d8fb45d6bc8a00cd6ce3b7aab88"}, - {file = "more_itertools-8.11.0-py3-none-any.whl", hash = "sha256:88afff98d83d08fe5e4049b81e2b54c06ebb6b3871a600040865c7a592061cbb"}, + {file = "more-itertools-8.12.0.tar.gz", hash = "sha256:7dc6ad46f05f545f900dd59e8dfb4e84a4827b97b3cfecb175ea0c7d247f6064"}, + {file = "more_itertools-8.12.0-py3-none-any.whl", hash = "sha256:43e6dd9942dffd72661a2c4ef383ad7da1e6a3e968a927ad7a6083ab410a688b"}, ] mr-proper = [ {file = "mr_proper-0.0.7-py3-none-any.whl", hash = "sha256:74a1b60240c46f10ba518707ef72811a01e5c270da0a78b5dd2dd923d99fdb14"}, @@ -4567,8 +4648,8 @@ mypy = [ {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"}, ] mypy-boto3-accessanalyzer = [ - {file = "mypy-boto3-accessanalyzer-1.20.1.tar.gz", hash = "sha256:646f95a38586a8d17c4253859f30897141869e4eab65d3790c8fe1bb581aee64"}, - {file = "mypy_boto3_accessanalyzer-1.20.1-py3-none-any.whl", hash = "sha256:31656fa0f3876af071f7eabf99218ee6f3c40deab57d241136b3764273fc1aaf"}, + {file = "mypy-boto3-accessanalyzer-1.20.17.tar.gz", hash = "sha256:b31cfddb0339a4db7969beeea34c3ca2a6992ad9d4fba42c09efc8aabceba53e"}, + {file = "mypy_boto3_accessanalyzer-1.20.17-py3-none-any.whl", hash = "sha256:36f49b9320317875b459cae7890850be027b709afc5e444436c1d3ab730734ed"}, ] mypy-boto3-account = [ {file = "mypy-boto3-account-1.20.1.tar.gz", hash = "sha256:611e8a99e1638ba6dab17a39bd5364061ac257aea2751ec8e5de076facd1ac70"}, @@ -4598,6 +4679,10 @@ mypy-boto3-amplifybackend = [ {file = "mypy-boto3-amplifybackend-1.20.8.tar.gz", hash = "sha256:08746360cf8708612dc78ff1ec510ffd0a6d520b1703c7c15117b69dbd8e6885"}, {file = "mypy_boto3_amplifybackend-1.20.8-py3-none-any.whl", hash = "sha256:cf1bb60e8f755206022efe09da4cf7df54b7556d179c1d04a9565a0d65370091"}, ] +mypy-boto3-amplifyuibuilder = [ + {file = "mypy-boto3-amplifyuibuilder-1.20.19.tar.gz", hash = "sha256:21ffd24068c5512ff3c43f226fe843ed7e87b0f64737a11ed1f2498d6d0547ee"}, + {file = "mypy_boto3_amplifyuibuilder-1.20.19-py3-none-any.whl", hash = "sha256:f3c025388ec8130eade8a82901f095889a09e2bd7fafd27a5f274ef1b366ad26"}, +] mypy-boto3-apigateway = [ {file = "mypy-boto3-apigateway-1.20.8.tar.gz", hash = "sha256:04f96a8a958bc7707f53ec1aac953caf734f6424e32bd643d824ea43228671ce"}, {file = "mypy_boto3_apigateway-1.20.8-py3-none-any.whl", hash = "sha256:99fb2d68d4ed5780236fc370c20791dfdead6e63e7f3637add510ca6c0cb8164"}, @@ -4651,8 +4736,8 @@ mypy-boto3-appstream = [ {file = "mypy_boto3_appstream-1.20.10-py3-none-any.whl", hash = "sha256:111b38f1c0b2c9ef436f88029594c3f458e9535256b94f9f60e17306ec0eab4a"}, ] mypy-boto3-appsync = [ - {file = "mypy-boto3-appsync-1.20.1.tar.gz", hash = "sha256:8cefb3635c53bfbbbaee3b3eacd51df173446e38adc363c9b0359731ee8b2694"}, - {file = "mypy_boto3_appsync-1.20.1-py3-none-any.whl", hash = "sha256:4775d085aca452be7a53ddcc195fbc792cc803d786119c7507ca2a04c5c14e7a"}, + {file = "mypy-boto3-appsync-1.20.21.tar.gz", hash = "sha256:8447140744df71bf480266f8eba5873fb2e004026172feb318e2058b4f3faae1"}, + {file = "mypy_boto3_appsync-1.20.21-py3-none-any.whl", hash = "sha256:33a1238919e88a305b30b8229576db2ad2e79d6ce1fb6468754c3b66be447cdb"}, ] mypy-boto3-athena = [ {file = "mypy-boto3-athena-1.20.1.tar.gz", hash = "sha256:747b7167a9656a7aebb0b8b2483f8521767489b42bc47017171c8d73fa699428"}, @@ -4663,24 +4748,28 @@ mypy-boto3-auditmanager = [ {file = "mypy_boto3_auditmanager-1.20.9-py3-none-any.whl", hash = "sha256:8fd88f7dff74213b1b0f8eea56e3cb7926bebf1dc4a1895a77c0c0a0f0eb6d96"}, ] mypy-boto3-autoscaling = [ - {file = "mypy-boto3-autoscaling-1.20.1.tar.gz", hash = "sha256:bd54230521676ed736264ff9f782016b8617453f121c755cc4b26befe5648b47"}, - {file = "mypy_boto3_autoscaling-1.20.1-py3-none-any.whl", hash = "sha256:63babec396e6d7d821a7537748580254ee11af4e49b4b2b2c6b2e8e52ca967e6"}, + {file = "mypy-boto3-autoscaling-1.20.14.tar.gz", hash = "sha256:470d51985240c9ccb5f7899c1913a84cc6496e03e6caf88505d46fb75a37b7ef"}, + {file = "mypy_boto3_autoscaling-1.20.14-py3-none-any.whl", hash = "sha256:fdc67f00f8b55c307d3184288d5fa3ef6cdc05a020a78ff3b9e85f5f2a566ed1"}, ] mypy-boto3-autoscaling-plans = [ {file = "mypy-boto3-autoscaling-plans-1.20.1.tar.gz", hash = "sha256:c29c508f92bc0ed1ea362d34697509cf3bb974a4657758ad814fdd7ecad9dfdd"}, {file = "mypy_boto3_autoscaling_plans-1.20.1-py3-none-any.whl", hash = "sha256:b6110e49e2bf6e08927fb5932afcc0ad98fd0415fd263fadafae246d12b8e42c"}, ] mypy-boto3-backup = [ - {file = "mypy-boto3-backup-1.20.3.tar.gz", hash = "sha256:f2e1a08a7d7fd3a4ddad40249775624e0f7d07fb1efc3d0545b7b6aa900f1bda"}, - {file = "mypy_boto3_backup-1.20.3-py3-none-any.whl", hash = "sha256:d49e9d4bf46e41e3a3e0f3ba9bcc86431994da7c1fb8bba0111588c0c9f3e42c"}, + {file = "mypy-boto3-backup-1.20.12.tar.gz", hash = "sha256:1bc07af20de48dc2baf6b81f7420620cbc2e170275dbdfcb898727970de49279"}, + {file = "mypy_boto3_backup-1.20.12-py3-none-any.whl", hash = "sha256:c14b30bf90e2d258639d79b1566aa1fba1b9d1570a7691f691614d2adc1a6148"}, +] +mypy-boto3-backup-gateway = [ + {file = "mypy-boto3-backup-gateway-1.20.17.tar.gz", hash = "sha256:e60840a5731dd9a24517862c098029a355391c0181166d8391441fdec9052b8f"}, + {file = "mypy_boto3_backup_gateway-1.20.17-py3-none-any.whl", hash = "sha256:cba15dee0f047d8b555c8c47827058151f7a1e362f951e4dba1bad4f8bf7a946"}, ] mypy-boto3-batch = [ {file = "mypy-boto3-batch-1.20.10.tar.gz", hash = "sha256:d8a3e2c511082b678167cf82c52abbd4c8e737143308665c11323c2caaae4f24"}, {file = "mypy_boto3_batch-1.20.10-py3-none-any.whl", hash = "sha256:03579be59c96f5ce7276c55436486970a686171b1a37d78b516eeb75a2f8c429"}, ] mypy-boto3-braket = [ - {file = "mypy-boto3-braket-1.20.1.tar.gz", hash = "sha256:c8ccd04acd92388b8a29fc74beb86833deac219ae9942dd5598ecf9aacdc70cb"}, - {file = "mypy_boto3_braket-1.20.1-py3-none-any.whl", hash = "sha256:9ba58bdeeee94af757f2592918ce615fc7a88b256c6919be4df0f22cb1c074c3"}, + {file = "mypy-boto3-braket-1.20.11.tar.gz", hash = "sha256:a3eac861b896e2ee1e95b489f0e288ddd980521741c239c7554b687485d2b985"}, + {file = "mypy_boto3_braket-1.20.11-py3-none-any.whl", hash = "sha256:18a2b6f26c1c6c8696e8eeb583031947e40818d37a059e7f19d9a2e68e2b73d2"}, ] mypy-boto3-budgets = [ {file = "mypy-boto3-budgets-1.20.1.tar.gz", hash = "sha256:f7316a02649d386c2d354fe8b865206bbf31e42b0f3688afdc133fe72b45141d"}, @@ -4699,8 +4788,8 @@ mypy-boto3-chime-sdk-identity = [ {file = "mypy_boto3_chime_sdk_identity-1.20.1-py3-none-any.whl", hash = "sha256:4ba3345c00ed6db96c02195586079ab78f93e1bf812d3b32225963c2c7111273"}, ] mypy-boto3-chime-sdk-meetings = [ - {file = "mypy-boto3-chime-sdk-meetings-1.20.9.tar.gz", hash = "sha256:101d3fc0c05e8c4ec3d82284b9e6c70702c478e87facbbf940cfdd9d1f952f5f"}, - {file = "mypy_boto3_chime_sdk_meetings-1.20.9-py3-none-any.whl", hash = "sha256:a740287e99c06a95f3bdf1ccb49b561f5c0493dfa6bc6f3ce48b4f16b9c14568"}, + {file = "mypy-boto3-chime-sdk-meetings-1.20.11.tar.gz", hash = "sha256:da282d1971421483cfa1d2836981a53f71581856a39d91eb9fd11f9d8d61fcfc"}, + {file = "mypy_boto3_chime_sdk_meetings-1.20.11-py3-none-any.whl", hash = "sha256:424ee0e244de5898e1e4e0b499aad441680c8e8f3b55af0f42ea7f794c9b869c"}, ] mypy-boto3-chime-sdk-messaging = [ {file = "mypy-boto3-chime-sdk-messaging-1.20.1.tar.gz", hash = "sha256:b65895e96f9f402fd7bcc4b120dfa1f2a32dfb405fbebc718d0af3690764ae2c"}, @@ -4719,8 +4808,8 @@ mypy-boto3-clouddirectory = [ {file = "mypy_boto3_clouddirectory-1.20.1-py3-none-any.whl", hash = "sha256:fb4b0e6bfe791e047ddafffc78a4e6afe1bae16cd257f0c53909ab378c25dfef"}, ] mypy-boto3-cloudformation = [ - {file = "mypy-boto3-cloudformation-1.20.10.tar.gz", hash = "sha256:1dd812d3015a5b3f1f1e28b0addae32010e3febc9917de8eaa11f7fa629a4c76"}, - {file = "mypy_boto3_cloudformation-1.20.10-py3-none-any.whl", hash = "sha256:4b5ff3795588bcd5479ef6167fcf33371a03f5d795bbe1e22487e89d4f2b1329"}, + {file = "mypy-boto3-cloudformation-1.20.11.tar.gz", hash = "sha256:763b2d69eda46ac05cd533efba26fc1854e627a1cb844bfd941d88201d325953"}, + {file = "mypy_boto3_cloudformation-1.20.11-py3-none-any.whl", hash = "sha256:57052da7bf7e2eb966e4bda37be9828be7f11fdc67337bd59bbfb98d8e222319"}, ] mypy-boto3-cloudfront = [ {file = "mypy-boto3-cloudfront-1.20.1.tar.gz", hash = "sha256:01b2c65fa522c56bf15f540558d6a15465591a0b8848e417c877628c5299accd"}, @@ -4807,20 +4896,20 @@ mypy-boto3-comprehend = [ {file = "mypy_boto3_comprehend-1.20.1-py3-none-any.whl", hash = "sha256:16e4fd9db16f60d70abfdec7b5d7c535073e011a7986f2836ec8692e0e537dbb"}, ] mypy-boto3-comprehendmedical = [ - {file = "mypy-boto3-comprehendmedical-1.20.1.tar.gz", hash = "sha256:7bf6a8fcc01bd2b1ef881eb92449f20982597fa67ed625e3193d69d9fe7c7cde"}, - {file = "mypy_boto3_comprehendmedical-1.20.1-py3-none-any.whl", hash = "sha256:0bc9204c37c977c5b3d68a581f6107dd5c15043b714d557b2e9b8a4be763578c"}, + {file = "mypy-boto3-comprehendmedical-1.20.22.tar.gz", hash = "sha256:27c3426de8bf82a03e09742997cd05bfded79f7484ae180a0906df54635e842c"}, + {file = "mypy_boto3_comprehendmedical-1.20.22-py3-none-any.whl", hash = "sha256:ffc574b92a69b372db30c13aa8cf04af968c8113626977938b34e260229db730"}, ] mypy-boto3-compute-optimizer = [ - {file = "mypy-boto3-compute-optimizer-1.20.1.tar.gz", hash = "sha256:b5a3a73fe8b65c16847cc051a7043a5b830d5fbfc3559ce6d25fedd7968a7af1"}, - {file = "mypy_boto3_compute_optimizer-1.20.1-py3-none-any.whl", hash = "sha256:f3eef02fc822ec737e2fe8fc394b2cae92abb75814cd0a6af05e0d84e9635c68"}, + {file = "mypy-boto3-compute-optimizer-1.20.16.tar.gz", hash = "sha256:67c89adbf09240a796a76647c6cba994391ceb14d4c5aa2f5643977ddcf1c3fc"}, + {file = "mypy_boto3_compute_optimizer-1.20.16-py3-none-any.whl", hash = "sha256:23d90efe89cd93a1a053d48068ba6b037b6c7915dee1af2c42ea335cc15d1321"}, ] mypy-boto3-config = [ {file = "mypy-boto3-config-1.20.1.tar.gz", hash = "sha256:7ca4ad191d303185f2a261034ef45df6cb253d17eb700c0b522f9a3835fdd33f"}, {file = "mypy_boto3_config-1.20.1-py3-none-any.whl", hash = "sha256:5d642abd8293d3ca081f2177f1409ff0f7a8850a52e55c858892176c741f43fb"}, ] mypy-boto3-connect = [ - {file = "mypy-boto3-connect-1.20.5.tar.gz", hash = "sha256:b87aa8a83cb1d66e0b82b39d251a60e5888c2604edb8504208fbc297a0d28733"}, - {file = "mypy_boto3_connect-1.20.5-py3-none-any.whl", hash = "sha256:c91220aae30cf3d7f057b236e983ae57852bce8916c279ef807dd5dd3288cb8d"}, + {file = "mypy-boto3-connect-1.20.11.tar.gz", hash = "sha256:8c066edf520e7cbddae8dc8b9669f5cb511aedf820fe0df685ccbdd4a464739a"}, + {file = "mypy_boto3_connect-1.20.11-py3-none-any.whl", hash = "sha256:3d1698d6384efbf536f36d796b5f569175ad92a4ec6b37e85c39449b111fdc6d"}, ] mypy-boto3-connect-contact-lens = [ {file = "mypy-boto3-connect-contact-lens-1.20.1.tar.gz", hash = "sha256:c04df80e93ba63f12d34d40adaa76c24b25c68271cb052d47140fceebf77b14f"}, @@ -4835,16 +4924,16 @@ mypy-boto3-cur = [ {file = "mypy_boto3_cur-1.20.1-py3-none-any.whl", hash = "sha256:659525122936e00d9d122e064d728c83e9f01c15940ea4ba677fff78fe4f4357"}, ] mypy-boto3-customer-profiles = [ - {file = "mypy-boto3-customer-profiles-1.20.1.tar.gz", hash = "sha256:66468e296fe72772696352fad458bdebb56ed1889f5a225e9eb9a152623bd814"}, - {file = "mypy_boto3_customer_profiles-1.20.1-py3-none-any.whl", hash = "sha256:bf368a7986bb89f94f89a213c70780dd1df59e522909622d4a86ea4a926d154c"}, + {file = "mypy-boto3-customer-profiles-1.20.13.tar.gz", hash = "sha256:7d4625e783aaadfd348e4fcb9b200b430dcebd57992dc7bf3a02cb67ae2cc634"}, + {file = "mypy_boto3_customer_profiles-1.20.13-py3-none-any.whl", hash = "sha256:fd4b419061dd1c77cfb6b6481ccae6289c80bf6f1472c338c08566a9ff3e5f7a"}, ] mypy-boto3-databrew = [ {file = "mypy-boto3-databrew-1.20.9.tar.gz", hash = "sha256:d86aea29554c871a12770fa4fcb54f671bbccf7beacf1cf6c04bb08fab57e371"}, {file = "mypy_boto3_databrew-1.20.9-py3-none-any.whl", hash = "sha256:719ebbdde7d7fc79513ca712006f497a28a7ad7ca9e4a6f94cf05b945a8e1284"}, ] mypy-boto3-dataexchange = [ - {file = "mypy-boto3-dataexchange-1.20.1.tar.gz", hash = "sha256:015470cee97decacdb8bd2f6a32a0a47b9c43a70914e054103887c1eaea6c713"}, - {file = "mypy_boto3_dataexchange-1.20.1-py3-none-any.whl", hash = "sha256:e9c7dbf37bcf6e5d7fa6e09839f8e04a20f13fab8d452745334ef4d285c8739c"}, + {file = "mypy-boto3-dataexchange-1.20.16.tar.gz", hash = "sha256:205578d78925b42ea10f1c572e163aa047e9b3c2a336378f9a3a6415fdadaa3f"}, + {file = "mypy_boto3_dataexchange-1.20.16-py3-none-any.whl", hash = "sha256:ca4445877bc4f2ee919738d7331839e038ae4cc0a350c3f10d169189b6d32b61"}, ] mypy-boto3-datapipeline = [ {file = "mypy-boto3-datapipeline-1.20.1.tar.gz", hash = "sha256:2874a7f6208a878c97f6035a5948df0b7f2a45410c683434919f1323cd88d4a2"}, @@ -4867,12 +4956,12 @@ mypy-boto3-devicefarm = [ {file = "mypy_boto3_devicefarm-1.20.1-py3-none-any.whl", hash = "sha256:b7ba9bdda3565113a6a3393c2eb6dbbf2c394c41b4f1e7b4115ff9f5b935015a"}, ] mypy-boto3-devops-guru = [ - {file = "mypy-boto3-devops-guru-1.20.5.tar.gz", hash = "sha256:b2890f6622dbff4a2fa0cdc2e84676d48b0379ded458137bbb0876b4b306e72f"}, - {file = "mypy_boto3_devops_guru-1.20.5-py3-none-any.whl", hash = "sha256:3b83f27c3fd9c8a9685254457ff555263e9a43f1e7fd0a7c61abc55082a474a9"}, + {file = "mypy-boto3-devops-guru-1.20.18.tar.gz", hash = "sha256:f498a07feec9a039b1ac8650da06d449ecfc374e0ecaedc4990b9626ae22dc6c"}, + {file = "mypy_boto3_devops_guru-1.20.18-py3-none-any.whl", hash = "sha256:67047727dd6f970988e3213d9f81587333da86f0ecd960cd0d4d5dc54f925dff"}, ] mypy-boto3-directconnect = [ - {file = "mypy-boto3-directconnect-1.20.1.tar.gz", hash = "sha256:078566fdc289b40e30a671699e0818e6c5d70dc926a5272f2bcd3fd1eebaea24"}, - {file = "mypy_boto3_directconnect-1.20.1-py3-none-any.whl", hash = "sha256:d9c3f4e5ed8682786aded8c7086353df1c174b7613f8e94115c38cf216385874"}, + {file = "mypy-boto3-directconnect-1.20.18.tar.gz", hash = "sha256:19db327164b76b48b9b35e424ac56ba4bed6314bc4105fa31ad32b99e8641ed0"}, + {file = "mypy_boto3_directconnect-1.20.18-py3-none-any.whl", hash = "sha256:97b92e581cf126ce27fec9484d76fe57185c0ce9efce6a6075291f0e0738130c"}, ] mypy-boto3-discovery = [ {file = "mypy-boto3-discovery-1.20.1.tar.gz", hash = "sha256:155eac55e97a9101a024d64c35e9413ae64b9a40fbf2e1a975715d7367f7ff5d"}, @@ -4883,8 +4972,8 @@ mypy-boto3-dlm = [ {file = "mypy_boto3_dlm-1.20.1-py3-none-any.whl", hash = "sha256:c4276a3d5b916f8e4c239b9dc6c31ba65c4611fc2d96571ac50dd53379c07739"}, ] mypy-boto3-dms = [ - {file = "mypy-boto3-dms-1.20.6.tar.gz", hash = "sha256:1da61b7f5d620770b0e4252359796a3c2f540e470b62cc26658652f15ff8f6c9"}, - {file = "mypy_boto3_dms-1.20.6-py3-none-any.whl", hash = "sha256:3f452cbd40368d7664df77001066373cb9c00b7f7cd3730217420dc90135a08f"}, + {file = "mypy-boto3-dms-1.20.11.tar.gz", hash = "sha256:c1460076c71a9530f91c0880fc24db1344bfe2e4de757b4568439aff867e1126"}, + {file = "mypy_boto3_dms-1.20.11-py3-none-any.whl", hash = "sha256:d39917182cfbac8191073b3d654ea6d09f5846e6296d3d3896d1d89f0c88d60d"}, ] mypy-boto3-docdb = [ {file = "mypy-boto3-docdb-1.20.1.tar.gz", hash = "sha256:8f0e894de5600c205e3655b4698469fdbf4b4c4725de97e6632df17294688936"}, @@ -4899,8 +4988,8 @@ mypy-boto3-ds = [ {file = "mypy_boto3_ds-1.20.1-py3-none-any.whl", hash = "sha256:ebe5645da27579eeb8666817039fd15e937cf943ab70d75db2163b7649c9e180"}, ] mypy-boto3-dynamodb = [ - {file = "mypy-boto3-dynamodb-1.20.4.tar.gz", hash = "sha256:f82e4a82ca6492e415d3c44103790bccf51c95804a44416feddd19baa1054a70"}, - {file = "mypy_boto3_dynamodb-1.20.4-py3-none-any.whl", hash = "sha256:3aa686949deb6254d3797d40ba5423a387f8aec7060b8cf542e2df2a2f4bd26d"}, + {file = "mypy-boto3-dynamodb-1.20.18.tar.gz", hash = "sha256:c01bf21384993adb7fdb57451826cbc6bee6c8602276295d9aee6d930f9e908a"}, + {file = "mypy_boto3_dynamodb-1.20.18-py3-none-any.whl", hash = "sha256:80b39a75b42937ed15ce6d333ede77f4b03273627b46999e6068383e7ae8b6dc"}, ] mypy-boto3-dynamodbstreams = [ {file = "mypy-boto3-dynamodbstreams-1.20.1.tar.gz", hash = "sha256:819abc44725ad02be5c7fec73a3723b39bf84d713c19593d91a923f1cf946054"}, @@ -4911,40 +5000,40 @@ mypy-boto3-ebs = [ {file = "mypy_boto3_ebs-1.20.1-py3-none-any.whl", hash = "sha256:4ee35353f67fece81291673b2a982fb6507c153c692643b48d7f7e15c3bdc55c"}, ] mypy-boto3-ec2 = [ - {file = "mypy-boto3-ec2-1.20.6.tar.gz", hash = "sha256:06855fc03bd8ea3d99e2b93e602796a429d697904fbf9afac2fd11452f5413f5"}, - {file = "mypy_boto3_ec2-1.20.6-py3-none-any.whl", hash = "sha256:5286a0403557968474b9e14039ad05047764557f19555c23f4bb61f64e210019"}, + {file = "mypy-boto3-ec2-1.20.23.tar.gz", hash = "sha256:b9cfca9baa5e41652d6d612feb24f54eedbf68a647acc26f518d308067eba355"}, + {file = "mypy_boto3_ec2-1.20.23-py3-none-any.whl", hash = "sha256:07149380b194b566ff6113277fbb7e4f54cc73b9f617d7ee7a24f21c9d48e5f9"}, ] mypy-boto3-ec2-instance-connect = [ {file = "mypy-boto3-ec2-instance-connect-1.20.1.tar.gz", hash = "sha256:e09e0a93ab476758c5f02f112eba23347c105e1a68feb622eda440b0dbd03b7c"}, {file = "mypy_boto3_ec2_instance_connect-1.20.1-py3-none-any.whl", hash = "sha256:63a12a70c2273a7ef47f3f29bd246fdd743f8c6f8ab78579c599841b098cf971"}, ] mypy-boto3-ecr = [ - {file = "mypy-boto3-ecr-1.20.1.tar.gz", hash = "sha256:87d24d8ee7600c6baf4b02c4cf4e34de39713b2b7e3fd59abda708ba72bc0397"}, - {file = "mypy_boto3_ecr-1.20.1-py3-none-any.whl", hash = "sha256:012bc549f8e679332de9bea4a07b33f64b7553a4cc320ee49e92ca15616eb5d2"}, + {file = "mypy-boto3-ecr-1.20.16.tar.gz", hash = "sha256:0edc06bcba2d364a0abffd51a9d780c179929d16ae4a3d125e33e0c452e176fd"}, + {file = "mypy_boto3_ecr-1.20.16-py3-none-any.whl", hash = "sha256:cf4da5b0d832d233d467487bc008c05932e10b65624b76073f2ba3a4d8d5a544"}, ] mypy-boto3-ecr-public = [ {file = "mypy-boto3-ecr-public-1.20.1.tar.gz", hash = "sha256:03829f55784e6c749f95611f5b9e68d5afc5a451089931bae753522d27d6cf93"}, {file = "mypy_boto3_ecr_public-1.20.1-py3-none-any.whl", hash = "sha256:d4be5897563dcec316ae3a8e468fbbb816c68431b3f755e7ef0e112635573f91"}, ] mypy-boto3-ecs = [ - {file = "mypy-boto3-ecs-1.20.3.tar.gz", hash = "sha256:94c9d34d97458f7be23649344864e27deaae53b59eeccb255654eed6cf3970c6"}, - {file = "mypy_boto3_ecs-1.20.3-py3-none-any.whl", hash = "sha256:2c8d9236c6a8d473232f219b2c90b700befcc92373d74da68a73d232874a7fcc"}, + {file = "mypy-boto3-ecs-1.20.12.tar.gz", hash = "sha256:477dc2ad6f1ae4a39a1c599032248446f24d2fe3e33ba99912db5eb64ee24f4b"}, + {file = "mypy_boto3_ecs-1.20.12-py3-none-any.whl", hash = "sha256:6f2c0b226abcc93c5b75bdfffabe380fb286b4e144b85f45f52847b42b4970f6"}, ] mypy-boto3-efs = [ {file = "mypy-boto3-efs-1.20.1.tar.gz", hash = "sha256:5947930d5721c7d0c5a188f9f88cef3623b5c63155472aa8516eb08837b529f6"}, {file = "mypy_boto3_efs-1.20.1-py3-none-any.whl", hash = "sha256:a026d95a67450ef3b4f03d798b0d5c4e268726e08a28a93054d30b27fe34f80b"}, ] mypy-boto3-eks = [ - {file = "mypy-boto3-eks-1.20.6.tar.gz", hash = "sha256:a651d24352980e8ec9b697454acac93fbacd6f6f62baa2cf366d354033e6a680"}, - {file = "mypy_boto3_eks-1.20.6-py3-none-any.whl", hash = "sha256:b8002d9e88154ecf88d28bf128a807a404aba18be094ef118ff93ddfc56ff04a"}, + {file = "mypy-boto3-eks-1.20.11.tar.gz", hash = "sha256:d68d8c014ae48600d5c5086db48afdba264f8c2a0c03261aa8c4ebac61184399"}, + {file = "mypy_boto3_eks-1.20.11-py3-none-any.whl", hash = "sha256:f89511b4c81396aa6b61c96ed9c3753297e57f7fdbc2e04afc580f9d9786a3b1"}, ] mypy-boto3-elastic-inference = [ {file = "mypy-boto3-elastic-inference-1.20.1.tar.gz", hash = "sha256:203e8c718b62c581d87d751d03fcecfc1bc0ad7233b5adf0cb1c179342d4bb7a"}, {file = "mypy_boto3_elastic_inference-1.20.1-py3-none-any.whl", hash = "sha256:7f276a45b3129dbe0cac75fec717f69544ce79b211ecf8a5c8be569377f6e2ac"}, ] mypy-boto3-elasticache = [ - {file = "mypy-boto3-elasticache-1.20.1.tar.gz", hash = "sha256:1d4fccc8cdee90b1e7d1f7103d8f2ebaf441398455ca7d0ff6435665de68bb59"}, - {file = "mypy_boto3_elasticache-1.20.1-py3-none-any.whl", hash = "sha256:a908a170da42b25dbb469a1c87d4ce6d521becebc414feb98ad17808bef92823"}, + {file = "mypy-boto3-elasticache-1.20.13.tar.gz", hash = "sha256:b3f9cf083c2587f4e3ad21cd4a2adb096c357e9c9b5ec49417aa848201917036"}, + {file = "mypy_boto3_elasticache-1.20.13-py3-none-any.whl", hash = "sha256:7e7777d4ae5789f52a664d290cabee9674937efab69922b5d0e25e35379b9e53"}, ] mypy-boto3-elasticbeanstalk = [ {file = "mypy-boto3-elasticbeanstalk-1.20.1.tar.gz", hash = "sha256:3306bd514919f65f4fbeeff79e3004d1fdef1693a28ef766d9e713a97aacda61"}, @@ -4959,8 +5048,8 @@ mypy-boto3-elb = [ {file = "mypy_boto3_elb-1.20.1-py3-none-any.whl", hash = "sha256:9788c342147a01acd0aa2f1f0bf2a91d71e51a9fd77df2cb2e1de4836e84fb86"}, ] mypy-boto3-elbv2 = [ - {file = "mypy-boto3-elbv2-1.20.1.tar.gz", hash = "sha256:b14dc362d845c2b4d4b2bdb4fa650f6cf4e31303657cea4ff6046492f582a3fa"}, - {file = "mypy_boto3_elbv2-1.20.1-py3-none-any.whl", hash = "sha256:8bc79af33c569f64ad9588a0b1416b35a311a7e05a3fa7d89ac02a2bbf38cd11"}, + {file = "mypy-boto3-elbv2-1.20.12.tar.gz", hash = "sha256:e8da09406091b20fca4c914aa891080367b57d11d4a0c6eb3e095fadee24193e"}, + {file = "mypy_boto3_elbv2-1.20.12-py3-none-any.whl", hash = "sha256:35be9f8a27254d0bc512a2d5a6fb8d13a3abc9ec29a81104473f20a7f5432a3f"}, ] mypy-boto3-emr = [ {file = "mypy-boto3-emr-1.20.1.tar.gz", hash = "sha256:20ff48769291e49945b655253c4c0d2f39a1106c362129ed3148f4d20f262249"}, @@ -4971,20 +5060,24 @@ mypy-boto3-emr-containers = [ {file = "mypy_boto3_emr_containers-1.20.1-py3-none-any.whl", hash = "sha256:5372cce246bdf10e747b299a1d293b8bac7afdc4eed80cc57847408da8336300"}, ] mypy-boto3-es = [ - {file = "mypy-boto3-es-1.20.1.tar.gz", hash = "sha256:56c9ab212c3c34709d639d550d39da25f666d24fc49a9ac8ada59911b9917688"}, - {file = "mypy_boto3_es-1.20.1-py3-none-any.whl", hash = "sha256:0b6706f891554a1a4d8d35a976a4c16acbd9d51c9f3dbedd033d47a39ad89a08"}, + {file = "mypy-boto3-es-1.20.11.tar.gz", hash = "sha256:13ccda66385639e0afa684f884ac20a1ccf0c403e75b764e38d1131a97ef80df"}, + {file = "mypy_boto3_es-1.20.11-py3-none-any.whl", hash = "sha256:f72c04b17d240f5017c101cc9dca7cb327935bcc1b2d5b2e7c7ff12f533a39b5"}, ] mypy-boto3-events = [ {file = "mypy-boto3-events-1.20.1.tar.gz", hash = "sha256:00404cf50f2d1edae472aa5a23be0d84ca8d3cc9f7e1beff2fb28d31737ba70d"}, {file = "mypy_boto3_events-1.20.1-py3-none-any.whl", hash = "sha256:09cea9995432ca96177ee2e76090c1a4b964d77cc87c0c39c57a114ec4da4ac6"}, ] +mypy-boto3-evidently = [ + {file = "mypy-boto3-evidently-1.20.16.tar.gz", hash = "sha256:683a8f11a58a17cfe8231a9a3e8191a9965bb5501c09272150c33637893dcb27"}, + {file = "mypy_boto3_evidently-1.20.16-py3-none-any.whl", hash = "sha256:7914ed40150de4fa1fa1e0a2409ab7f8044ff001139712d88a5e03179ba1c5e4"}, +] mypy-boto3-finspace = [ {file = "mypy-boto3-finspace-1.20.1.tar.gz", hash = "sha256:c4f5167e2d7588c55345d268b208e2e17906087f7f869278213d464935f5e784"}, {file = "mypy_boto3_finspace-1.20.1-py3-none-any.whl", hash = "sha256:603d351e489f31dc795989475f5417265b55e61aa05b36d219e00113a36343d8"}, ] mypy-boto3-finspace-data = [ - {file = "mypy-boto3-finspace-data-1.20.1.tar.gz", hash = "sha256:3a3dc7060d1727faad2dda19ad135e8d3821bb195293d0e72da42ede9de8b9a3"}, - {file = "mypy_boto3_finspace_data-1.20.1-py3-none-any.whl", hash = "sha256:e773ef112c2183a272e8266b2caa5d4b1ea8d8f24fa757fb26de0067df917d72"}, + {file = "mypy-boto3-finspace-data-1.20.12.tar.gz", hash = "sha256:2eb5fc65a3734190969edbdbe6a73a674b273e66593414c01622b4ae2d77d557"}, + {file = "mypy_boto3_finspace_data-1.20.12-py3-none-any.whl", hash = "sha256:67f6533e7e347ce4786a17624799c846210be4afb8a92624ff4d4050f337d4d1"}, ] mypy-boto3-firehose = [ {file = "mypy-boto3-firehose-1.20.1.tar.gz", hash = "sha256:af1800d5a1c33762ba40e698928294d6860ec9a4864694741a2496e11c67ef03"}, @@ -5011,8 +5104,8 @@ mypy-boto3-frauddetector = [ {file = "mypy_boto3_frauddetector-1.20.1-py3-none-any.whl", hash = "sha256:10245c46675785c1658c2f6e441b41616f58d38a3d8d843f6b9f89063e2bb500"}, ] mypy-boto3-fsx = [ - {file = "mypy-boto3-fsx-1.20.1.tar.gz", hash = "sha256:efb4d2dc55353b501c0d04578fd69646892b21a51dce3e8032a20425ef554104"}, - {file = "mypy_boto3_fsx-1.20.1-py3-none-any.whl", hash = "sha256:cddfe43bf0456aa2b79d00607e24d4fefedda382867327404abfe8cdf73d4bdc"}, + {file = "mypy-boto3-fsx-1.20.17.tar.gz", hash = "sha256:34ec6ab66c78c09002e06df2e72b039e32f2b3e7ffcce2cb9a97997672b2bd0d"}, + {file = "mypy_boto3_fsx-1.20.17-py3-none-any.whl", hash = "sha256:6605aa0581091e3d88ed66510ac3becad427729411c0d3ff34bb44634e151596"}, ] mypy-boto3-gamelift = [ {file = "mypy-boto3-gamelift-1.20.1.tar.gz", hash = "sha256:519ac6e654167892d8be97655e6dce4f4a4b8a44b7862b088df5a9f05772db7a"}, @@ -5027,8 +5120,8 @@ mypy-boto3-globalaccelerator = [ {file = "mypy_boto3_globalaccelerator-1.20.1-py3-none-any.whl", hash = "sha256:239010655f9ffe4803289ecd235d1794814d13a3a236e95a88515bb1b68dee69"}, ] mypy-boto3-glue = [ - {file = "mypy-boto3-glue-1.20.1.tar.gz", hash = "sha256:b33a9193d2ecf96fa66c75b051695838c35588bb33233dfd0ee9e95ce847aad4"}, - {file = "mypy_boto3_glue-1.20.1-py3-none-any.whl", hash = "sha256:a150ec2bd1a099609ec5fe414f0bedbfaa6f5083ca9e6f21cf3cc868bff7b991"}, + {file = "mypy-boto3-glue-1.20.17.tar.gz", hash = "sha256:d2c62626ff06cc7b0ea06ef9422f9238034ae6029da9479b0c9fc15ede3eaa40"}, + {file = "mypy_boto3_glue-1.20.17-py3-none-any.whl", hash = "sha256:f6d3b96ee05837013a84e2a4cf7c60389dbbf157988306b2a57fbc312348412f"}, ] mypy-boto3-grafana = [ {file = "mypy-boto3-grafana-1.20.1.tar.gz", hash = "sha256:629f89d5098863e3f451a2b6c06d9788c77d7c799572a31dfefc08a81924afa5"}, @@ -5051,8 +5144,8 @@ mypy-boto3-guardduty = [ {file = "mypy_boto3_guardduty-1.20.1-py3-none-any.whl", hash = "sha256:dfba4bb04d8791e4ea554c2c63ba495c550fa85f3df7ca92015e80e04ace00bb"}, ] mypy-boto3-health = [ - {file = "mypy-boto3-health-1.20.2.tar.gz", hash = "sha256:c83a4a7e3a5a806793a2025b603a6d72ad38f2d21f3664640a1395dde1bcb4d2"}, - {file = "mypy_boto3_health-1.20.2-py3-none-any.whl", hash = "sha256:e5f6b01ffa1059a7e3715444e959876ab35288df960e3cf8792104d5de487f54"}, + {file = "mypy-boto3-health-1.20.22.tar.gz", hash = "sha256:fbb82e23badb28137c7c38fe498f1eb35ed5f35ec19ac561edf97fac2880d3f2"}, + {file = "mypy_boto3_health-1.20.22-py3-none-any.whl", hash = "sha256:615c284020dea3b99fb2f57918d5491ed1188b8cf8f8136879c175c1f9a1f99f"}, ] mypy-boto3-healthlake = [ {file = "mypy-boto3-healthlake-1.20.1.tar.gz", hash = "sha256:2fb62c20a9159691c7862f789b5cb9753620128354a71c7f658a75679ec0b7a8"}, @@ -5071,8 +5164,8 @@ mypy-boto3-identitystore = [ {file = "mypy_boto3_identitystore-1.20.1-py3-none-any.whl", hash = "sha256:ec1cb9acedf879ff1f1adfa0debc884b075773614db1281d93e83847ff34e97c"}, ] mypy-boto3-imagebuilder = [ - {file = "mypy-boto3-imagebuilder-1.20.1.tar.gz", hash = "sha256:a8d016aaaed010a767402a5b370afe68458505181e059ef0733ecb1d1c2b5ae0"}, - {file = "mypy_boto3_imagebuilder-1.20.1-py3-none-any.whl", hash = "sha256:cbf940bb9fa3c579ad23db862adc9d1d01548358fb4ea87e7d639adf7013922d"}, + {file = "mypy-boto3-imagebuilder-1.20.13.tar.gz", hash = "sha256:93fb1c158b5b0b79dad2ff510869f67a1607ef99880cc60a584942e564c45684"}, + {file = "mypy_boto3_imagebuilder-1.20.13-py3-none-any.whl", hash = "sha256:88bb46d77c90952f484004afad31400f87496f9610586630276f5e90a5747d3a"}, ] mypy-boto3-importexport = [ {file = "mypy-boto3-importexport-1.20.1.tar.gz", hash = "sha256:4b68419d434ebc3a41c062bce3da543ee671bfe9815f8c8f28247d83693a1611"}, @@ -5082,9 +5175,13 @@ mypy-boto3-inspector = [ {file = "mypy-boto3-inspector-1.20.1.tar.gz", hash = "sha256:d6d82e1d4f15bc4f5e7d9787f9125c3bb188608ab3cd69186620f4261a7adc18"}, {file = "mypy_boto3_inspector-1.20.1-py3-none-any.whl", hash = "sha256:49f940f2940cc0805ec9cc2eb56f99aaa3d29e82f82e15f47e8b97f29c6ac677"}, ] +mypy-boto3-inspector2 = [ + {file = "mypy-boto3-inspector2-1.20.16.tar.gz", hash = "sha256:6ed2da352ae4a84030ab2ef6764f03cac7a6af20a7dec0d546f3ce70b717d3cd"}, + {file = "mypy_boto3_inspector2-1.20.16-py3-none-any.whl", hash = "sha256:369671848097523d2b5723ccd17a4e4c5f69cc943f0ebe690a76e53d74f82747"}, +] mypy-boto3-iot = [ - {file = "mypy-boto3-iot-1.20.1.tar.gz", hash = "sha256:d01f018e99e9b0774f1ab54319511a3947cec1a3a1152be9d4edf926d64be97f"}, - {file = "mypy_boto3_iot-1.20.1-py3-none-any.whl", hash = "sha256:271df647247cf5705a86bb1a377eee34d386e170ec4b742d11a77a577e85d47a"}, + {file = "mypy-boto3-iot-1.20.22.tar.gz", hash = "sha256:b59d0739ad9a95fb5e80797f935828fcb2ed4b0299e07d0fe19832915af3732d"}, + {file = "mypy_boto3_iot-1.20.22-py3-none-any.whl", hash = "sha256:a658afcbf849abcd363040361dfab613f7d8ed8ba5d7531ed4ef448953c539de"}, ] mypy-boto3-iot-data = [ {file = "mypy-boto3-iot-data-1.20.1.tar.gz", hash = "sha256:23cbd27c40f9d7aecc333b113a48919a72b61fb7113ca351d69cfa4cabbcf42a"}, @@ -5107,8 +5204,8 @@ mypy-boto3-iotanalytics = [ {file = "mypy_boto3_iotanalytics-1.20.1-py3-none-any.whl", hash = "sha256:28c64f10be5d439bdbde4b0e041b2f2be74594cb8ed32fec540338f607861771"}, ] mypy-boto3-iotdeviceadvisor = [ - {file = "mypy-boto3-iotdeviceadvisor-1.20.1.tar.gz", hash = "sha256:856233811dcece351777d4b22a46b51bee3f76619a5c737e08d0f897cc4e9bf6"}, - {file = "mypy_boto3_iotdeviceadvisor-1.20.1-py3-none-any.whl", hash = "sha256:7ad2b31728f326696590f72d182520cf8502182e903635249506aa4a746e3a88"}, + {file = "mypy-boto3-iotdeviceadvisor-1.20.14.tar.gz", hash = "sha256:628b2084546d4f2855742f27891faaf37c15e45e161276e7711dbcc8114c2cf9"}, + {file = "mypy_boto3_iotdeviceadvisor-1.20.14-py3-none-any.whl", hash = "sha256:6d26c01d524daacb1ccf356b7236c2dab78494bcba71a803e4e9b8d444177d20"}, ] mypy-boto3-iotevents = [ {file = "mypy-boto3-iotevents-1.20.1.tar.gz", hash = "sha256:1a785e85a52efa7ee090438b6a472d7f258f73b11d04627bc5d7af4f2267b157"}, @@ -5127,36 +5224,40 @@ mypy-boto3-iotsecuretunneling = [ {file = "mypy_boto3_iotsecuretunneling-1.20.1-py3-none-any.whl", hash = "sha256:a12df6badf87a8c15fb9bf781aa001b27714486435fecaed6774c4383dcce5a3"}, ] mypy-boto3-iotsitewise = [ - {file = "mypy-boto3-iotsitewise-1.20.1.tar.gz", hash = "sha256:926f08a29f52ac593fd36587696b7ffe520c2f7fd9ea3ef37865e56f49d25e20"}, - {file = "mypy_boto3_iotsitewise-1.20.1-py3-none-any.whl", hash = "sha256:356839c60419b320f9c33ab76d387d3513e2c9d0040792dfd343d43f9d064a6f"}, + {file = "mypy-boto3-iotsitewise-1.20.16.tar.gz", hash = "sha256:1d63d31c32f8efb01ba50760715e159068a398a1236b351e8383b084466d8c78"}, + {file = "mypy_boto3_iotsitewise-1.20.16-py3-none-any.whl", hash = "sha256:c1db10b1cb5f76d5a2c0e63bb41c275b28a7ffdb6a215c16e56ab6f50f02f61d"}, ] mypy-boto3-iotthingsgraph = [ {file = "mypy-boto3-iotthingsgraph-1.20.1.tar.gz", hash = "sha256:cfa6646e94443db3971ed679f6fb931f0559ccc4692d8bb2fad923189ebbb4f8"}, {file = "mypy_boto3_iotthingsgraph-1.20.1-py3-none-any.whl", hash = "sha256:2e21c9b0b9a3c78c1dda4083677b0a2fd949abcb49aa7a0e15e707d6583ee7d3"}, ] +mypy-boto3-iottwinmaker = [ + {file = "mypy-boto3-iottwinmaker-1.20.17.tar.gz", hash = "sha256:992ab00711410a31b5f4312c6a908bca465686a4d0fc61152153a796a128b97d"}, + {file = "mypy_boto3_iottwinmaker-1.20.17-py3-none-any.whl", hash = "sha256:f276f9631512a2b394127188867d56a7b17c4104e5ac78c313736888a9acfb76"}, +] mypy-boto3-iotwireless = [ - {file = "mypy-boto3-iotwireless-1.20.1.tar.gz", hash = "sha256:89900b67b6dc7e40f35b4cb1af57462af172c46983a46dca056e1d98898f4530"}, - {file = "mypy_boto3_iotwireless-1.20.1-py3-none-any.whl", hash = "sha256:fd2710a82f75ae25091bd8f586947553f030ea4d5a5ba362c981343cdc8fe70d"}, + {file = "mypy-boto3-iotwireless-1.20.12.tar.gz", hash = "sha256:aec3933007cc2b704197227260e0e63929aaa07f5766884005c0fa8a28d67ec8"}, + {file = "mypy_boto3_iotwireless-1.20.12-py3-none-any.whl", hash = "sha256:2953b823f73b11575b0472ab5edb04f0d415b5a6a2d5d5372b013a6d090e3ae9"}, ] mypy-boto3-ivs = [ {file = "mypy-boto3-ivs-1.20.9.tar.gz", hash = "sha256:a7aec4f9dbb7cd9dcc939c75fd5427e9bafa22eac6c856a25a532bc558e17a46"}, {file = "mypy_boto3_ivs-1.20.9-py3-none-any.whl", hash = "sha256:dba3758e6d1c89f80ef6ebaa72b15526d5a87a5f66547aef7d7b60ff0b807087"}, ] mypy-boto3-kafka = [ - {file = "mypy-boto3-kafka-1.20.9.tar.gz", hash = "sha256:ec4220de6a5e004e46b89167fc85116467f9287676963b6df4c121748bce8a16"}, - {file = "mypy_boto3_kafka-1.20.9-py3-none-any.whl", hash = "sha256:74afb3b749970c9f934a26c67feb0d5740a6e0c790c1d31af164676937723d07"}, + {file = "mypy-boto3-kafka-1.20.17.tar.gz", hash = "sha256:ea4ba35ca00cc333f3952faf3a4ec95a59e8687c632c580d713ec555513cf5d2"}, + {file = "mypy_boto3_kafka-1.20.17-py3-none-any.whl", hash = "sha256:f21e181a218db1ad7fc6830a20341e8004d80513e40d0aadbfc767dd7d5975e7"}, ] mypy-boto3-kafkaconnect = [ {file = "mypy-boto3-kafkaconnect-1.20.1.tar.gz", hash = "sha256:c4fe5fc8ae1060c69d238d367f8b687c44c2dbb77bf36f969a2265dd7dd51420"}, {file = "mypy_boto3_kafkaconnect-1.20.1-py3-none-any.whl", hash = "sha256:48a2fc822771e0ed5bb62d964d0e7003464a9b6413d0f6cd7aecec5d922b9179"}, ] mypy-boto3-kendra = [ - {file = "mypy-boto3-kendra-1.20.1.tar.gz", hash = "sha256:f7bb37fc7e72a1ed522016a99736d266900f7ad8bc864e53b8b8a67f1f5e974d"}, - {file = "mypy_boto3_kendra-1.20.1-py3-none-any.whl", hash = "sha256:13d3463ec6f962aca5caffb47cc18d393b8bd8d9f5b20bea2eb725d241d007c5"}, + {file = "mypy-boto3-kendra-1.20.18.tar.gz", hash = "sha256:330744f9080b78c888f515dd4ea75f79e37658e36a2d6ac56c27b3622bfcdc19"}, + {file = "mypy_boto3_kendra-1.20.18-py3-none-any.whl", hash = "sha256:370d2251ecde2a306cea0af291f77a884cfe66ddbe889e8c48a5c9071b749c5a"}, ] mypy-boto3-kinesis = [ - {file = "mypy-boto3-kinesis-1.20.1.tar.gz", hash = "sha256:c4aa47db47c01f5d32844a0d98de7e4ef14885f82c0bf894d2a16890d46cd44c"}, - {file = "mypy_boto3_kinesis-1.20.1-py3-none-any.whl", hash = "sha256:4940f3f09ece0d100f32129bc4a9f18529d27f53ececf23dd793df9ec2f12e6c"}, + {file = "mypy-boto3-kinesis-1.20.17.tar.gz", hash = "sha256:71d62238f7a28a6161f08cbe74b8b2b0fddb35a5c781d58f847e9284a4f83b14"}, + {file = "mypy_boto3_kinesis-1.20.17-py3-none-any.whl", hash = "sha256:82fccd8d0b4e5cd530dd17fea852f4d86f65c2fe8469e7d36ebebca5110dca23"}, ] mypy-boto3-kinesis-video-archived-media = [ {file = "mypy-boto3-kinesis-video-archived-media-1.20.1.tar.gz", hash = "sha256:34bce8d66fcd047c3b3314a2f3950d325a221bf734fe08b53f4093ea05e358e8"}, @@ -5187,12 +5288,12 @@ mypy-boto3-kms = [ {file = "mypy_boto3_kms-1.20.1-py3-none-any.whl", hash = "sha256:39c10228d7668b75fe18d790d04cd3ab364f2cb0319e3a9d7eb6641be98ac87c"}, ] mypy-boto3-lakeformation = [ - {file = "mypy-boto3-lakeformation-1.20.1.tar.gz", hash = "sha256:c72b2bdf25f7524cae672529e5c805f6b6ff9bad92efa42262b0a36331d4a908"}, - {file = "mypy_boto3_lakeformation-1.20.1-py3-none-any.whl", hash = "sha256:ed6d21e43695c20858531e18d4a28487cf1ce2133a8338903226ee20e05026fe"}, + {file = "mypy-boto3-lakeformation-1.20.17.tar.gz", hash = "sha256:4d5fc419125a2807422ddd384638b970b67be50075000f8ee59b30cc2d0f74b2"}, + {file = "mypy_boto3_lakeformation-1.20.17-py3-none-any.whl", hash = "sha256:1670fbcf5101dca3c4905ceb48fcb32d7df39d87951d9b6ab82fe70613e8e722"}, ] mypy-boto3-lambda = [ - {file = "mypy-boto3-lambda-1.20.10.tar.gz", hash = "sha256:e64e7f9c727dca716713116d5c7f1c825c1964374d4e4eeea513beeddae73620"}, - {file = "mypy_boto3_lambda-1.20.10-py3-none-any.whl", hash = "sha256:a5d4586792400c6b9d0d0b82ff5f2b2eaccc148fe388c0ed51378e279ccffa1a"}, + {file = "mypy-boto3-lambda-1.20.13.tar.gz", hash = "sha256:8245c9ff98af11c58c713261049825c00a13648eeca00369ea80140b56e6ecba"}, + {file = "mypy_boto3_lambda-1.20.13-py3-none-any.whl", hash = "sha256:26513ac4bfe815ec1b05ab10ba10afe7c274397dcbadd4953a7e32a169503b35"}, ] mypy-boto3-lex-models = [ {file = "mypy-boto3-lex-models-1.20.1.tar.gz", hash = "sha256:8cd0b6ae5354cc0474154b915bd9e40334f9159bc86cbcc845c9d2502b8df7f9"}, @@ -5203,8 +5304,8 @@ mypy-boto3-lex-runtime = [ {file = "mypy_boto3_lex_runtime-1.20.1-py3-none-any.whl", hash = "sha256:7cb648ea350f6bb9fc417d2325ca6322396bb63e7452eaea2869bae90bbf30ea"}, ] mypy-boto3-lexv2-models = [ - {file = "mypy-boto3-lexv2-models-1.20.9.tar.gz", hash = "sha256:8dde7c702a9470f1a9ee8f777e0c6844b0374c11cb285c38ca88f78333bc134f"}, - {file = "mypy_boto3_lexv2_models-1.20.9-py3-none-any.whl", hash = "sha256:ff6d479300e8d0152dc0d0f6ee66673801bba677b0dd5a14d4b5723795b7cec4"}, + {file = "mypy-boto3-lexv2-models-1.20.23.tar.gz", hash = "sha256:4d6708b8d03691fdade858d9c9bafc00866763a1e72920b36414d9facd90a76c"}, + {file = "mypy_boto3_lexv2_models-1.20.23-py3-none-any.whl", hash = "sha256:63e64888547715fb35694dee26827a1cbf686337a499c55f34fd8087cdf7a35e"}, ] mypy-boto3-lexv2-runtime = [ {file = "mypy-boto3-lexv2-runtime-1.20.10.tar.gz", hash = "sha256:eda7eb7e6b7c29afbea1327cf27cb56e0960b46af2789477c429eada0da42d2b"}, @@ -5219,12 +5320,12 @@ mypy-boto3-lightsail = [ {file = "mypy_boto3_lightsail-1.20.1-py3-none-any.whl", hash = "sha256:8dabc200be9d41043697090ba799d3c55b84b94d0a3eb86f3b0b3d1d6d16ab3e"}, ] mypy-boto3-location = [ - {file = "mypy-boto3-location-1.20.7.tar.gz", hash = "sha256:dc475ad600beadc75c2132a558e5f4eb3251f9addc66755e8489d9eaacfb6135"}, - {file = "mypy_boto3_location-1.20.7-py3-none-any.whl", hash = "sha256:ee3851e15a599e8e130da7d924afabb29adcaf4ef7e2c57e96db860d5a74cab3"}, + {file = "mypy-boto3-location-1.20.21.tar.gz", hash = "sha256:e9e0abbe902eb4899dfb92ee51a1d34d85fe8b8d5408f5740844709331b7b858"}, + {file = "mypy_boto3_location-1.20.21-py3-none-any.whl", hash = "sha256:ea9c130604b2240ffa287c3940e3b070d2e8f847032cb1545a05f1b7291adc6e"}, ] mypy-boto3-logs = [ - {file = "mypy-boto3-logs-1.20.1.tar.gz", hash = "sha256:e2cb94da2c228c96577dd92e49a363fd4dc761f8a615516ae1960f113a48715f"}, - {file = "mypy_boto3_logs-1.20.1-py3-none-any.whl", hash = "sha256:11ad54e4b1daf63334c8006e2fe3749e142580f7a47701758f11372da4c15341"}, + {file = "mypy-boto3-logs-1.20.22.tar.gz", hash = "sha256:3babd25794cc23af0840a78058d2cbbb0505b9c69dc0d19133352650d4ef729c"}, + {file = "mypy_boto3_logs-1.20.22-py3-none-any.whl", hash = "sha256:900214d741383a33a6edf04e0a2f9983bbd0f1cae245aa14bc8a7765764c49ed"}, ] mypy-boto3-lookoutequipment = [ {file = "mypy-boto3-lookoutequipment-1.20.1.tar.gz", hash = "sha256:177df3c1eeb20d172f4a0d471a103fe635831f114104871ea106abe8ec8ef1a5"}, @@ -5235,8 +5336,8 @@ mypy-boto3-lookoutmetrics = [ {file = "mypy_boto3_lookoutmetrics-1.20.1-py3-none-any.whl", hash = "sha256:2d9750a5a009837a479b9cfe0c32df0fc3d76184e72773fb5b97038e7c064778"}, ] mypy-boto3-lookoutvision = [ - {file = "mypy-boto3-lookoutvision-1.20.1.tar.gz", hash = "sha256:1150b8a7cb2e411e59c00d13ebaf03ebb8efcb9060daaa2235fd9b7bb9c2dbe7"}, - {file = "mypy_boto3_lookoutvision-1.20.1-py3-none-any.whl", hash = "sha256:e987717246c48e332d1d6e5c058576612db4861f02290149ed6dc1d509bc0c11"}, + {file = "mypy-boto3-lookoutvision-1.20.22.tar.gz", hash = "sha256:7fa54ce0d3ea76a8e2ab032057e5c2c74afd092334a0764aa2e2d4f38f51ee95"}, + {file = "mypy_boto3_lookoutvision-1.20.22-py3-none-any.whl", hash = "sha256:1680b558d704562373b759cba9a44c9932cb88a5ae326f10a12e5ab834bed22c"}, ] mypy-boto3-machinelearning = [ {file = "mypy-boto3-machinelearning-1.20.1.tar.gz", hash = "sha256:347c37286a9a60ffe17f75e9e3c2fa3ce6702773ddf287495af62589e77c3330"}, @@ -5247,8 +5348,8 @@ mypy-boto3-macie = [ {file = "mypy_boto3_macie-1.20.1-py3-none-any.whl", hash = "sha256:2f093a37f33a449329ea3611892c1ff4b4ae589f23df6b7b8bd77f2cc9182416"}, ] mypy-boto3-macie2 = [ - {file = "mypy-boto3-macie2-1.20.1.tar.gz", hash = "sha256:f477215ba936c0306943183125d2e44f46bb99c53e487b70a90d26696ef724a7"}, - {file = "mypy_boto3_macie2-1.20.1-py3-none-any.whl", hash = "sha256:5a759ed8b50d4466b2d16c5f26da6e1a186407dc320133a3a17344ef90e00ce3"}, + {file = "mypy-boto3-macie2-1.20.12.tar.gz", hash = "sha256:001f3de2d4f99c8928fd183b8227022092d86996259d56f81e56e97059374879"}, + {file = "mypy_boto3_macie2-1.20.12-py3-none-any.whl", hash = "sha256:fb3bc746dc14a7c3b8da26b66368e3f051a4330cd19d8ded3806a9f001507944"}, ] mypy-boto3-managedblockchain = [ {file = "mypy-boto3-managedblockchain-1.20.1.tar.gz", hash = "sha256:c9e4c69d558eb90b23cb088b2e89488853f26973b46889161059a436f99e8de4"}, @@ -5311,8 +5412,12 @@ mypy-boto3-mgh = [ {file = "mypy_boto3_mgh-1.20.1-py3-none-any.whl", hash = "sha256:b0c3e9f98ff2191bb9745acb3380c30855c0687fd7dc386e9d17fd609457c8ba"}, ] mypy-boto3-mgn = [ - {file = "mypy-boto3-mgn-1.20.1.tar.gz", hash = "sha256:e1325742146a8fea2ac906c4f636e80d26ba409491330d9e4d7f136f88a89e0d"}, - {file = "mypy_boto3_mgn-1.20.1-py3-none-any.whl", hash = "sha256:0da37c7f8c6b6a7de8934757e4f80729cd55e8acb24c80dfc7d919efa35580a1"}, + {file = "mypy-boto3-mgn-1.20.14.tar.gz", hash = "sha256:ea039acacd9e81cc87814ec8edba3b17fc1ddf1243630c8d6f1f6ce4279bf3b7"}, + {file = "mypy_boto3_mgn-1.20.14-py3-none-any.whl", hash = "sha256:7292d83893626b562b58406a4ed42d06cc59dad14119853d433ff8c5cae0b512"}, +] +mypy-boto3-migration-hub-refactor-spaces = [ + {file = "mypy-boto3-migration-hub-refactor-spaces-1.20.15.tar.gz", hash = "sha256:ccc1ffd6a2da58ff7543f9ed419a1377df6e980ff75d520a45f452dfeef1c514"}, + {file = "mypy_boto3_migration_hub_refactor_spaces-1.20.15-py3-none-any.whl", hash = "sha256:aa5602b5905d670b4cf773c99e705d51bcf956f29db24621ea0c34816ccfb011"}, ] mypy-boto3-migrationhub-config = [ {file = "mypy-boto3-migrationhub-config-1.20.1.tar.gz", hash = "sha256:179cb5f113ce616f86f71b28e189a899f01f1644ae3d25dfe27f3013e4717db2"}, @@ -5343,20 +5448,20 @@ mypy-boto3-neptune = [ {file = "mypy_boto3_neptune-1.20.1-py3-none-any.whl", hash = "sha256:4a25db724ec9a1658e5488fef1a1cea6c94f1670033a3f136cd18564a59085cd"}, ] mypy-boto3-network-firewall = [ - {file = "mypy-boto3-network-firewall-1.20.1.tar.gz", hash = "sha256:169544c7bf7041e09d5273b9159871f13f8472f743f041532f62cf655ab54292"}, - {file = "mypy_boto3_network_firewall-1.20.1-py3-none-any.whl", hash = "sha256:42af7aa483555c968cb516a9ed77143323d8c5f62208c0dbbdc6963df4143aa7"}, + {file = "mypy-boto3-network-firewall-1.20.23.tar.gz", hash = "sha256:9378b9e1462bf7dbddc51b68410418b4bd7b93b6fc40fc063f19b7828e460d18"}, + {file = "mypy_boto3_network_firewall-1.20.23-py3-none-any.whl", hash = "sha256:2a1b2e0b6e128643d4fae627a252a2c873adf7f45847e1c1ce949a02c8a488c6"}, ] mypy-boto3-networkmanager = [ - {file = "mypy-boto3-networkmanager-1.20.1.tar.gz", hash = "sha256:03f76a686037fc8c5e3545bdb0440321cf012a37f89ccf5f7e944a66c348a46c"}, - {file = "mypy_boto3_networkmanager-1.20.1-py3-none-any.whl", hash = "sha256:a1cad97c415127a8182ab9254f381048061fad258fc23379e0efee361ec92792"}, + {file = "mypy-boto3-networkmanager-1.20.19.tar.gz", hash = "sha256:87657d89292f4e1dcb68133d86cbc19e812ef62407942ba9a4f8d1c36efb71e6"}, + {file = "mypy_boto3_networkmanager-1.20.19-py3-none-any.whl", hash = "sha256:312e7a51c946f2d9f9248a8cabd7f21407a0b4612fab70818f5a0de80bf1aac0"}, ] mypy-boto3-nimble = [ {file = "mypy-boto3-nimble-1.20.1.tar.gz", hash = "sha256:5ce33f82546f355b9d212606fbaf82ba45477e5714680959344db56a340e49e7"}, {file = "mypy_boto3_nimble-1.20.1-py3-none-any.whl", hash = "sha256:8a5589aaa3fca24f938ab233e2e632400dc7359887aaa45a88645785eea24250"}, ] mypy-boto3-opensearch = [ - {file = "mypy-boto3-opensearch-1.20.1.tar.gz", hash = "sha256:99089d69cdb42a01d5850d4b9addc39993be0ce6fbbbc28447ac6367f0d6afcd"}, - {file = "mypy_boto3_opensearch-1.20.1-py3-none-any.whl", hash = "sha256:7b276ae5afba59482f7b681e76700bbd4c91206c23f258739e5fad259479613e"}, + {file = "mypy-boto3-opensearch-1.20.12.tar.gz", hash = "sha256:894c338b9b331c249095d0164616db3c398d37a134f9d4abef3d333a56320bbb"}, + {file = "mypy_boto3_opensearch-1.20.12-py3-none-any.whl", hash = "sha256:4a67fcfac70a9bc8f469678a06c99dfed002f74a3fe1ff71e5b9497505d59648"}, ] mypy-boto3-opsworks = [ {file = "mypy-boto3-opsworks-1.20.1.tar.gz", hash = "sha256:10703a90a2bc7a9b836eec24c650aaebeebd4d79998a055f2c1b3d3ddc4a766f"}, @@ -5371,32 +5476,32 @@ mypy-boto3-organizations = [ {file = "mypy_boto3_organizations-1.20.1-py3-none-any.whl", hash = "sha256:fd2d33665762017df59e04c05f42a2c995c590e2803bdc99538beaf6635bbda2"}, ] mypy-boto3-outposts = [ - {file = "mypy-boto3-outposts-1.20.1.tar.gz", hash = "sha256:6cc858d6f8e79c621ba1d9f6211979358dd58e512128821faf625d8380e48462"}, - {file = "mypy_boto3_outposts-1.20.1-py3-none-any.whl", hash = "sha256:9ee6e2ffa3598dc69b1f3ad4adbf74a016f153a2a2240210a7a54683ea8ad82b"}, + {file = "mypy-boto3-outposts-1.20.22.tar.gz", hash = "sha256:756ecd383a09d4baee7ef039e4c253ffe60cbf10aac914b10f9c9d79e9ee3d44"}, + {file = "mypy_boto3_outposts-1.20.22-py3-none-any.whl", hash = "sha256:b3463ef916d1079286a0ef6b5da6213de6d4dd3e4016584bc02a5582fe06e989"}, ] mypy-boto3-panorama = [ {file = "mypy-boto3-panorama-1.20.1.tar.gz", hash = "sha256:030bdf046462366b9f79cf8e178dd8f410171f46383230c5abb7f53ad815897b"}, {file = "mypy_boto3_panorama-1.20.1-py3-none-any.whl", hash = "sha256:05148e9192c83971a27f436eb09f0c3f8a5e0127f87475d7645015e0e5429fce"}, ] mypy-boto3-personalize = [ - {file = "mypy-boto3-personalize-1.20.1.tar.gz", hash = "sha256:51b7d6089b1b7b25dd91a66cd6de1465e35c83e6e79a16818873589d6600febf"}, - {file = "mypy_boto3_personalize-1.20.1-py3-none-any.whl", hash = "sha256:099ca3c4567557eee65d91ac4e3d6b4862938cca8d3707302c63402fe92d32e3"}, + {file = "mypy-boto3-personalize-1.20.15.tar.gz", hash = "sha256:6c4b0fdac372abab69c29b9064c9f3e047e29fdd39efdbea3d0b810fd5614c25"}, + {file = "mypy_boto3_personalize-1.20.15-py3-none-any.whl", hash = "sha256:3a1c3af0932f3fb3a9acbcd594157fa2beb6f7bf0d673e4aae829b9c12b58ac1"}, ] mypy-boto3-personalize-events = [ {file = "mypy-boto3-personalize-events-1.20.1.tar.gz", hash = "sha256:8d423448fca40b699a0c4614d074e29c56bc3cb2b7e63012d1cf84010cd81a12"}, {file = "mypy_boto3_personalize_events-1.20.1-py3-none-any.whl", hash = "sha256:cf33b0a6ee55484a0b91469ed5a4b2892d9d6d939584fa4e53a10a5a4d3d1a1c"}, ] mypy-boto3-personalize-runtime = [ - {file = "mypy-boto3-personalize-runtime-1.20.1.tar.gz", hash = "sha256:1636a0eada1c3003d9d9691f339e30a36b670a303bf5c571b3b3a36a4ba38fd5"}, - {file = "mypy_boto3_personalize_runtime-1.20.1-py3-none-any.whl", hash = "sha256:40e8af4bdaa8254075e3bd9afc7f28308cabf094882f9e8851be5b84a9a9ebf2"}, + {file = "mypy-boto3-personalize-runtime-1.20.15.tar.gz", hash = "sha256:5b4dda533a11809cb6ed72d4f1abf204408b2e2b9f061b22347f432349bade03"}, + {file = "mypy_boto3_personalize_runtime-1.20.15-py3-none-any.whl", hash = "sha256:3248555f2714bd62ffea2ee622ccfc086de0d4b78488e5ad79282c848c19531a"}, ] mypy-boto3-pi = [ {file = "mypy-boto3-pi-1.20.1.tar.gz", hash = "sha256:9345304b4d758dceb037a5bd2b1d9e5521b75d76b4c95c6657584f9a64ae095c"}, {file = "mypy_boto3_pi-1.20.1-py3-none-any.whl", hash = "sha256:6bd486fadc618be6dce36a69f8831da0782da22b6ebf233969a963de2b3993e2"}, ] mypy-boto3-pinpoint = [ - {file = "mypy-boto3-pinpoint-1.20.1.tar.gz", hash = "sha256:42aacd5e20a45f321499ff340b8abdf7724f32a11d2573f82eb9c7266fcdc757"}, - {file = "mypy_boto3_pinpoint-1.20.1-py3-none-any.whl", hash = "sha256:10ccf5b0d0b4dda47c6e4ce79cc19393658e28dcbefbdd2b4272387b6f42429f"}, + {file = "mypy-boto3-pinpoint-1.20.14.tar.gz", hash = "sha256:0e3cb7bd0577f8168097215ff0c4d56c8e9940ff3e6a1fb60f293fbdd2156032"}, + {file = "mypy_boto3_pinpoint-1.20.14-py3-none-any.whl", hash = "sha256:cb8443e39d7ac0435b253128ad436a80fceff0f6be9f67f71c8e2885d5912943"}, ] mypy-boto3-pinpoint-email = [ {file = "mypy-boto3-pinpoint-email-1.20.1.tar.gz", hash = "sha256:c365660a1c30de0a992daccc478a5e568ae34719364ad48037de5b2de9d4dd5f"}, @@ -5415,8 +5520,8 @@ mypy-boto3-pricing = [ {file = "mypy_boto3_pricing-1.20.1-py3-none-any.whl", hash = "sha256:b08c4aba9da4a669726ccbe40b60a6141dff377b4a22859b588adce4e05181c8"}, ] mypy-boto3-proton = [ - {file = "mypy-boto3-proton-1.20.1.tar.gz", hash = "sha256:09c66672f2d89b9d0cfebbde83cdf90bef35d4337ac3104e91d4da00b74f829b"}, - {file = "mypy_boto3_proton-1.20.1-py3-none-any.whl", hash = "sha256:f1a1b7c0c8b4e4b43e3be7d114e2e321e0ac795774212d2e354a02b7c30c5c41"}, + {file = "mypy-boto3-proton-1.20.13.tar.gz", hash = "sha256:8fecc572b737739910193935ae318d6fb98a3a90c4b75534c8f341d61e953f0f"}, + {file = "mypy_boto3_proton-1.20.13-py3-none-any.whl", hash = "sha256:902be63e6f1385e8afd01f0141588ef4aed02556aa39b05b9b8408bacee3563c"}, ] mypy-boto3-qldb = [ {file = "mypy-boto3-qldb-1.20.1.tar.gz", hash = "sha256:fe102bd56267519924fab55e3a014bd2152ef4f7fa745866ac58c82bbc5c9a5c"}, @@ -5427,32 +5532,36 @@ mypy-boto3-qldb-session = [ {file = "mypy_boto3_qldb_session-1.20.1-py3-none-any.whl", hash = "sha256:89fe36266997a82837849880b0e2a5c746df00329e0b612eaf9588db99256a88"}, ] mypy-boto3-quicksight = [ - {file = "mypy-boto3-quicksight-1.20.1.tar.gz", hash = "sha256:8a690f40c97915a7c520aecb43212b756a6f7566d9396e05a4c620620edb4ccd"}, - {file = "mypy_boto3_quicksight-1.20.1-py3-none-any.whl", hash = "sha256:07cb4a4ca0171272ba7614ae2e8bc975b38e40190931f304efd6171cde14f30a"}, + {file = "mypy-boto3-quicksight-1.20.11.tar.gz", hash = "sha256:531555bc2658cc394dbc11cf03a80c16fb8e48ce080bba7cbd5c67e2ab4a1311"}, + {file = "mypy_boto3_quicksight-1.20.11-py3-none-any.whl", hash = "sha256:62acd0261ffb9a68a4a9895ba7b01e381d9b221abdaffec90d87eeaf0b2db45a"}, ] mypy-boto3-ram = [ - {file = "mypy-boto3-ram-1.20.1.tar.gz", hash = "sha256:0925cb82cce1f22e93af551b6f6adf17c80ad9e8aa77634be05b373f32e27f44"}, - {file = "mypy_boto3_ram-1.20.1-py3-none-any.whl", hash = "sha256:c5467e840387a8ac402248c530d5d7d824dcc9ae1133085cb1de8d66f62fda16"}, + {file = "mypy-boto3-ram-1.20.19.tar.gz", hash = "sha256:2f94d8fd890ccc343cb2337547930928672a959ff3c352a7abe7a1122ed88dcf"}, + {file = "mypy_boto3_ram-1.20.19-py3-none-any.whl", hash = "sha256:c30d5107a16224a2418111bf6ee6942bc02b39d30285c476cf9d0a0d1b6c6673"}, +] +mypy-boto3-rbin = [ + {file = "mypy-boto3-rbin-1.20.16.tar.gz", hash = "sha256:9c7f2598514e931d7da80d88026fe96d1ba9475c581e6c447ae81ce945779d04"}, + {file = "mypy_boto3_rbin-1.20.16-py3-none-any.whl", hash = "sha256:2de799c8246165fc11cc50b412cbbb121a1d963f2d042b71704698bddd191385"}, ] mypy-boto3-rds = [ - {file = "mypy-boto3-rds-1.20.1.tar.gz", hash = "sha256:d6c10fa2a91399b9d1841f15598942df1d6aab6921186c1166540e80897d3fb7"}, - {file = "mypy_boto3_rds-1.20.1-py3-none-any.whl", hash = "sha256:b471c03bc5f8ee6adbd4c7ee0404dee2001994f1d28eb514264e2ce25afd6588"}, + {file = "mypy-boto3-rds-1.20.12.tar.gz", hash = "sha256:386237c3e8ccf94f1939de9e62e11bfa804d526e1b0967f6d238d1b8bc58250b"}, + {file = "mypy_boto3_rds-1.20.12-py3-none-any.whl", hash = "sha256:5ca66e84bb861e6fc7772f3896234e2b0b87ae91c2a21487df062b2d680976bb"}, ] mypy-boto3-rds-data = [ {file = "mypy-boto3-rds-data-1.20.1.tar.gz", hash = "sha256:b57a4ba42a3471b49fd1306d467cc59b9cc03c0626180a55fcfa31d9362436c9"}, {file = "mypy_boto3_rds_data-1.20.1-py3-none-any.whl", hash = "sha256:8b0287fad26a4658eae7ed43ae67ee3481f2ba8fd39555ebe130ed890e316a44"}, ] mypy-boto3-redshift = [ - {file = "mypy-boto3-redshift-1.20.10.tar.gz", hash = "sha256:125c43f177762806e7d72383dfe77290336508c8455993d66e3d6ef88b878b50"}, - {file = "mypy_boto3_redshift-1.20.10-py3-none-any.whl", hash = "sha256:a1f186463fea439351012b1df571eca130a7499d81fe7c5304b4831579f7b81c"}, + {file = "mypy-boto3-redshift-1.20.12.tar.gz", hash = "sha256:df47bf7f59371e5f5e6b510c093f5f1a76c9ac34d17f65ea9e2ba1e3ce9039de"}, + {file = "mypy_boto3_redshift-1.20.12-py3-none-any.whl", hash = "sha256:8a98724d885d4d75652f8831a0705c3b7dad4310b884e24b5def6a9ea86ebeec"}, ] mypy-boto3-redshift-data = [ - {file = "mypy-boto3-redshift-data-1.20.9.tar.gz", hash = "sha256:e7feede7449b69cfcc82122ae93e45180e428690561f575bdeb1d862937bf5d4"}, - {file = "mypy_boto3_redshift_data-1.20.9-py3-none-any.whl", hash = "sha256:e60f8b6ab6156230e602d6490de48400228838b19695a942763a1c66aec3cf91"}, + {file = "mypy-boto3-redshift-data-1.20.17.tar.gz", hash = "sha256:d5159c893187130e9eff426d28b27dd69baa6062e0129adcada639fa119c271a"}, + {file = "mypy_boto3_redshift_data-1.20.17-py3-none-any.whl", hash = "sha256:f29b373f7bdf179dd88eca7a56f674f082b2f3f5a188caa6db675d9dc149037e"}, ] mypy-boto3-rekognition = [ - {file = "mypy-boto3-rekognition-1.20.1.tar.gz", hash = "sha256:6d733299689d7d6ef2909b89e6dfbf8666f60bb754d26637479c623615f13cb3"}, - {file = "mypy_boto3_rekognition-1.20.1-py3-none-any.whl", hash = "sha256:25661d445564c66bd87eb09113d7d187a2835b68463582234aa0daf5432928ae"}, + {file = "mypy-boto3-rekognition-1.20.20.tar.gz", hash = "sha256:dbdb1cceae505785c7ba3bf1e8ce127723c62aaa8b32f752a18bd4bb34ad4e3b"}, + {file = "mypy_boto3_rekognition-1.20.20-py3-none-any.whl", hash = "sha256:c7620cce941d20b967561c0a8138ac651ab9a1bfe631d0cf3336896e390decf4"}, ] mypy-boto3-resiliencehub = [ {file = "mypy-boto3-resiliencehub-1.20.3.tar.gz", hash = "sha256:03badb69d67d90666609b754632946abbe13305e476448aa862f0addee630270"}, @@ -5471,44 +5580,48 @@ mypy-boto3-robomaker = [ {file = "mypy_boto3_robomaker-1.20.1-py3-none-any.whl", hash = "sha256:d2b4641d42669ac46b013098122bc12d31b48ee8b6f1febd7409ff9df1f7b5c8"}, ] mypy-boto3-route53 = [ - {file = "mypy-boto3-route53-1.20.1.tar.gz", hash = "sha256:20a968db08a4baed6ef47e7b978e3dec7c164dc162cd16c09e16d82314009206"}, - {file = "mypy_boto3_route53-1.20.1-py3-none-any.whl", hash = "sha256:931a1da8c25d83260f690648d11351207d39657993bce9537ade04dad1f79622"}, + {file = "mypy-boto3-route53-1.20.21.tar.gz", hash = "sha256:0bd644235c7f808e08fffed88eb965025f4bed89a53689906f930e9752eceeb3"}, + {file = "mypy_boto3_route53-1.20.21-py3-none-any.whl", hash = "sha256:b0c260be2c8a8d72b17c753e518b8a44f1cb85e9feea2a2dce5bbedf8b6348f9"}, ] mypy-boto3-route53-recovery-cluster = [ {file = "mypy-boto3-route53-recovery-cluster-1.20.1.tar.gz", hash = "sha256:1f3e52f983e22198d1a854be11fe2566382d803abce43e4edbd381a8b3db12c6"}, {file = "mypy_boto3_route53_recovery_cluster-1.20.1-py3-none-any.whl", hash = "sha256:8bc0c17ca9d0456ea4ea90e7bf619c615146abe9f88ebfd9e929e4660bd88862"}, ] mypy-boto3-route53-recovery-control-config = [ - {file = "mypy-boto3-route53-recovery-control-config-1.20.1.tar.gz", hash = "sha256:2662e6d93d07e477fcbbefd2e296ee5d37c0fa91a999fdf266b4f620e4c6ddf5"}, - {file = "mypy_boto3_route53_recovery_control_config-1.20.1-py3-none-any.whl", hash = "sha256:af411e2be006e0fa2d0519c0bffee7d758380d4b0cda770a3d5def1c2cd18a12"}, + {file = "mypy-boto3-route53-recovery-control-config-1.20.23.tar.gz", hash = "sha256:abc212eb6173eab99ab82ec6d7a9d366fafa2be90ad8971c7ac9ef7f7d9e901f"}, + {file = "mypy_boto3_route53_recovery_control_config-1.20.23-py3-none-any.whl", hash = "sha256:9db1fe5f272d697f0221f525b8f035e4e65fa6e28f6f7fff529eeedfe4ee4624"}, ] mypy-boto3-route53-recovery-readiness = [ {file = "mypy-boto3-route53-recovery-readiness-1.20.1.tar.gz", hash = "sha256:e72c5c46d3cb12bb96c985c9f1e7c19d407cb003dd4a8407b553675c93349522"}, {file = "mypy_boto3_route53_recovery_readiness-1.20.1-py3-none-any.whl", hash = "sha256:5d52d3f5a899ff10db400fe037c930c1a81a62a55030099dba6d0c68bbd74fe4"}, ] mypy-boto3-route53domains = [ - {file = "mypy-boto3-route53domains-1.20.1.tar.gz", hash = "sha256:6871f5571d9eeb66434f1b593e5b012c1e5b87e0470d6f5c2c80da8339bbe96d"}, - {file = "mypy_boto3_route53domains-1.20.1-py3-none-any.whl", hash = "sha256:0dffb067b44d2a69eb66c237c8855f4fe365500f124074d5aaad8fa62ed71041"}, + {file = "mypy-boto3-route53domains-1.20.23.tar.gz", hash = "sha256:710704197407f5849a23dfe1d3df2feaf463aec00c37ceb67efea39f31aefa0a"}, + {file = "mypy_boto3_route53domains-1.20.23-py3-none-any.whl", hash = "sha256:2c5386b3adb454735d3ea2098cb6fa1ad4a8ac61c598a7bd9fe1b2f244310450"}, ] mypy-boto3-route53resolver = [ {file = "mypy-boto3-route53resolver-1.20.1.tar.gz", hash = "sha256:d0db0fed5e60cc20b3048babe733b66b068985e2f9ffcf05406e3016b66f8737"}, {file = "mypy_boto3_route53resolver-1.20.1-py3-none-any.whl", hash = "sha256:58460452541e5905eb1e5c12e819e1d6af288adc290c4583734cd8cff08d5d4b"}, ] +mypy-boto3-rum = [ + {file = "mypy-boto3-rum-1.20.16.tar.gz", hash = "sha256:8b9c8295912db080216ee1b452c339ca763c230d36554672ef2be15fd1a4c4ca"}, + {file = "mypy_boto3_rum-1.20.16-py3-none-any.whl", hash = "sha256:98bc156c4464e16d925c066141a1d29179e0a921275f721b59a2432a99993582"}, +] mypy-boto3-s3 = [ - {file = "mypy-boto3-s3-1.20.1.tar.gz", hash = "sha256:4675a50e25e8974ef8822920f22e38f6bc7810d1bb01cee4cfd94c8b5dab92ec"}, - {file = "mypy_boto3_s3-1.20.1-py3-none-any.whl", hash = "sha256:44276f3efb51c5299652882b348df28da376667303fedfd49d40fca0b9146d9d"}, + {file = "mypy-boto3-s3-1.20.17.tar.gz", hash = "sha256:ed9c3c3713845c34662c28711d05d553f1f347ccfa1ee2f15fc6c1de966e0aa7"}, + {file = "mypy_boto3_s3-1.20.17-py3-none-any.whl", hash = "sha256:662709293bd1a83d66e40a34abf3c3b4deb9f9dcb88ae1cc6aacb65615967429"}, ] mypy-boto3-s3control = [ - {file = "mypy-boto3-s3control-1.20.1.tar.gz", hash = "sha256:bd0fa272a254685191e0395bc925296299b5fd96069b4fe73c78dc3a0491782e"}, - {file = "mypy_boto3_s3control-1.20.1-py3-none-any.whl", hash = "sha256:1ecfc4b61ce647b09fa7df4a9e4e08051c5e1f913bd441830f252853ccbc0a71"}, + {file = "mypy-boto3-s3control-1.20.11.tar.gz", hash = "sha256:1989fcc75162ff321b73abf085685cd720b2e0a22086e4dc1c11ea836ab598e3"}, + {file = "mypy_boto3_s3control-1.20.11-py3-none-any.whl", hash = "sha256:d2a7c416bdd20d03e96a49c418745adaf41a8a2d03d7910edc8be27f52e084d8"}, ] mypy-boto3-s3outposts = [ {file = "mypy-boto3-s3outposts-1.20.1.tar.gz", hash = "sha256:0114cb8058888e26c5619fcab2f1e028833e8acaf55ea16cd8f513d977429efc"}, {file = "mypy_boto3_s3outposts-1.20.1-py3-none-any.whl", hash = "sha256:3517329d1dd66d916bbf8c0cfd1b63a3f8e0c971c49b651e280836f08a4598f5"}, ] mypy-boto3-sagemaker = [ - {file = "mypy-boto3-sagemaker-1.20.1.tar.gz", hash = "sha256:274526ffe0b9f8db20da850c419613d88c0e785145f4508f8e76017ba228d398"}, - {file = "mypy_boto3_sagemaker-1.20.1-py3-none-any.whl", hash = "sha256:6a6a2fa66681585c6d11b06f576edcee5e37f25df2e2cbad64ad957fc394b115"}, + {file = "mypy-boto3-sagemaker-1.20.22.tar.gz", hash = "sha256:bfce1d840c9c5fbf8e467fff063b9721d54f3ae4b33e5232114ea29a389003a6"}, + {file = "mypy_boto3_sagemaker-1.20.22-py3-none-any.whl", hash = "sha256:5c6aee800a80d9c736ac8d4cb47ae0ce60e712280b8624c2c268fb95a2d5eb04"}, ] mypy-boto3-sagemaker-a2i-runtime = [ {file = "mypy-boto3-sagemaker-a2i-runtime-1.20.1.tar.gz", hash = "sha256:74d98e9d7bbafc8b679d38802cc80584f589f1cad804680bfacf33c9b92c3aff"}, @@ -5523,12 +5636,12 @@ mypy-boto3-sagemaker-featurestore-runtime = [ {file = "mypy_boto3_sagemaker_featurestore_runtime-1.20.1-py3-none-any.whl", hash = "sha256:270f16d96f775153c2a1c326dd66810a387347f34e46399c6823866343fa601a"}, ] mypy-boto3-sagemaker-runtime = [ - {file = "mypy-boto3-sagemaker-runtime-1.20.1.tar.gz", hash = "sha256:c71b04f6115cb78bcffa14664f7cc721f41249875b37805b46360da9310b3136"}, - {file = "mypy_boto3_sagemaker_runtime-1.20.1-py3-none-any.whl", hash = "sha256:7991a9895d9dfa978f360fa697e22cdf3dd8b02b25a9b179ac5f02c9a9d2831e"}, + {file = "mypy-boto3-sagemaker-runtime-1.20.18.tar.gz", hash = "sha256:9ef4ae92eb685a1a7e62d5cf38fa2f209d94985cebc9517d0eef5d7b41bf3471"}, + {file = "mypy_boto3_sagemaker_runtime-1.20.18-py3-none-any.whl", hash = "sha256:59e8f38d935ff66362160777336d988c66165e8ffce0eca53e6a06ff6ae0b0fa"}, ] mypy-boto3-savingsplans = [ - {file = "mypy-boto3-savingsplans-1.20.1.tar.gz", hash = "sha256:24e4676b934fe6bde2b64cb89971d178dd3898655bf8c86aba9aa038fab39e00"}, - {file = "mypy_boto3_savingsplans-1.20.1-py3-none-any.whl", hash = "sha256:8adf5559806ab6903ec10864ac2992f59a6bb092e2dd33d940982408bd1f87a1"}, + {file = "mypy-boto3-savingsplans-1.20.23.tar.gz", hash = "sha256:4cf981b66d519bf906faa175f05847a06c095fb676c8c0a329622a3ce9029b47"}, + {file = "mypy_boto3_savingsplans-1.20.23-py3-none-any.whl", hash = "sha256:65bb109be728009bc949d5710bae109b2da316eee673131823e371bbac274954"}, ] mypy-boto3-schemas = [ {file = "mypy-boto3-schemas-1.20.1.tar.gz", hash = "sha256:9c3fc745c79b8faee8dee2a5de0d6dbe63e69c0eeb32a238b74ad20f3e9220bd"}, @@ -5575,16 +5688,16 @@ mypy-boto3-sesv2 = [ {file = "mypy_boto3_sesv2-1.20.1-py3-none-any.whl", hash = "sha256:0d1ac36b02b711c85b37981966e1935bd4079ecf5924e27dc104710b4437333a"}, ] mypy-boto3-shield = [ - {file = "mypy-boto3-shield-1.20.1.tar.gz", hash = "sha256:ffa449bbe476faea7c86d487d0a89145aa88ad1371f0e37ef8e8429c4cda0a3c"}, - {file = "mypy_boto3_shield-1.20.1-py3-none-any.whl", hash = "sha256:140eb1c2fcf8ddeaa333f967a0262e29482173fe20dd912937d74c6eda46ed08"}, + {file = "mypy-boto3-shield-1.20.18.tar.gz", hash = "sha256:2d2974b0f74704b96ccf9f7d8edcdc519aaa7566edc045ae5af62b2ac331f77a"}, + {file = "mypy_boto3_shield-1.20.18-py3-none-any.whl", hash = "sha256:9c0c27c54ae59109e8e885f2c4c9ef79bc6591b96c223ab2dae180b2fed1b467"}, ] mypy-boto3-signer = [ {file = "mypy-boto3-signer-1.20.1.tar.gz", hash = "sha256:c6f817037aa4ec054e8d1c843edaee51b907ce167d76209dca6d0f077ad1c2e3"}, {file = "mypy_boto3_signer-1.20.1-py3-none-any.whl", hash = "sha256:fccf79e2afb842b1d4e98393f0aebe74a62887dcf54a293d2040bfe63b919358"}, ] mypy-boto3-sms = [ - {file = "mypy-boto3-sms-1.20.1.tar.gz", hash = "sha256:7d4628a6e5d0f3f8e36411084a54cd2f876cd143d712575053716f3889604440"}, - {file = "mypy_boto3_sms-1.20.1-py3-none-any.whl", hash = "sha256:088e379e1791d96c74a0c78693311857d1b6eb919fffa363ccc87ce24f1e8b77"}, + {file = "mypy-boto3-sms-1.20.23.tar.gz", hash = "sha256:17fe35cc7f10d60b4563965c5b6f0879812e50d106c9a2438e035b700b47f62c"}, + {file = "mypy_boto3_sms-1.20.23-py3-none-any.whl", hash = "sha256:98a676a6503fea364f632c97568bb3d2a23e519d248a88ddc04974fed0332174"}, ] mypy-boto3-sms-voice = [ {file = "mypy-boto3-sms-voice-1.20.1.tar.gz", hash = "sha256:93aef85a75d6410cc9af4faf8042faecc0f1b0b508b769ca68e9214d928af798"}, @@ -5595,20 +5708,20 @@ mypy-boto3-snow-device-management = [ {file = "mypy_boto3_snow_device_management-1.20.1-py3-none-any.whl", hash = "sha256:f9bd4eb76b893cee3d289a9c615d306be8369ae92a945e5958ab1487a1ae5bc9"}, ] mypy-boto3-snowball = [ - {file = "mypy-boto3-snowball-1.20.1.tar.gz", hash = "sha256:40cc7a024be93bc92b673b20eb17938b0715e39dcb1ceafebd4bb0def5c1ff14"}, - {file = "mypy_boto3_snowball-1.20.1-py3-none-any.whl", hash = "sha256:0eaca1d7c68d52a9ee6509878ff4822bbe93e5498eba91c57dcc1318aa212829"}, + {file = "mypy-boto3-snowball-1.20.17.tar.gz", hash = "sha256:9075c4678cb8c58234bda0239fa6e2c2eb921da990caf8eca21e04d8c7e4e8f5"}, + {file = "mypy_boto3_snowball-1.20.17-py3-none-any.whl", hash = "sha256:0920ad116c23efcf82a429560b6e1ff0161e00209a59d32d2c6f818ed4da3070"}, ] mypy-boto3-sns = [ {file = "mypy-boto3-sns-1.20.8.tar.gz", hash = "sha256:343bf98d9b85982ac2a6ba6dccaa0260ada0d2015b9f1b6daa646fc825ee0db1"}, {file = "mypy_boto3_sns-1.20.8-py3-none-any.whl", hash = "sha256:3c011a5c56e0d6c41b289341892b6452852c619bd6b1fdfb08bfd8a0b44ada5a"}, ] mypy-boto3-sqs = [ - {file = "mypy-boto3-sqs-1.20.1.tar.gz", hash = "sha256:b1113241704a1015c63add947654571a8b67ade7895fd11a79282b9a1d65b5bc"}, - {file = "mypy_boto3_sqs-1.20.1-py3-none-any.whl", hash = "sha256:b12c71cbad7976aa83dcb2c41c227dc5b520555bf2022c825044568be3e45f82"}, + {file = "mypy-boto3-sqs-1.20.12.tar.gz", hash = "sha256:1c284553d0269b4379a6e9e18ff86e7dc8798c9b5a78db667ae78591779ffeb4"}, + {file = "mypy_boto3_sqs-1.20.12-py3-none-any.whl", hash = "sha256:0956b4fdc56f58a1666fb540a6c921e433d4d88b91914d1c73812985ea60a21d"}, ] mypy-boto3-ssm = [ - {file = "mypy-boto3-ssm-1.20.6.tar.gz", hash = "sha256:9903d65fcbe59db9b393fa3aa1801583dbe4421d571a35d13297fd5a19467e1c"}, - {file = "mypy_boto3_ssm-1.20.6-py3-none-any.whl", hash = "sha256:f0b186a5dff17a0d225d78ea5fcf7d840b2235f95b0e0188f9ffb5bbc3bd3b60"}, + {file = "mypy-boto3-ssm-1.20.16.tar.gz", hash = "sha256:1f14fb62988a5dd3a4fed8110c240a14220d807565c9e58f47515849f2c639c2"}, + {file = "mypy_boto3_ssm-1.20.16-py3-none-any.whl", hash = "sha256:14c8e8da6eb4fccd609cc3dbcc3a52cbd7b986ed1ecce15829fbae76c9c7150b"}, ] mypy-boto3-ssm-contacts = [ {file = "mypy-boto3-ssm-contacts-1.20.1.tar.gz", hash = "sha256:14f0be049151c7b04ac0a9afafc8689783ffcba8123d74583356904f6bc7cd79"}, @@ -5635,16 +5748,16 @@ mypy-boto3-stepfunctions = [ {file = "mypy_boto3_stepfunctions-1.20.1-py3-none-any.whl", hash = "sha256:437a875c2752018ba858cf29315e1519fc66908a17e1ef499506401a6930651f"}, ] mypy-boto3-storagegateway = [ - {file = "mypy-boto3-storagegateway-1.20.1.tar.gz", hash = "sha256:e83183935825183da654a41e380454c51c7ded09328cff9b1ab8b8ef47ecbe5d"}, - {file = "mypy_boto3_storagegateway-1.20.1-py3-none-any.whl", hash = "sha256:9d2c6e658d5d16e01f94809b2a20617f1b13cdb9fc427632f04d7f4eda7ac990"}, + {file = "mypy-boto3-storagegateway-1.20.17.tar.gz", hash = "sha256:63d6ef4a140b29fe61ade3bcb0b1c347248282a70f4ec56102d4441dab411a1a"}, + {file = "mypy_boto3_storagegateway-1.20.17-py3-none-any.whl", hash = "sha256:81a62e71717aea14debd95b203c460f94e3ddbc6e738ab913c4ee8afa0878f72"}, ] mypy-boto3-sts = [ - {file = "mypy-boto3-sts-1.20.1.tar.gz", hash = "sha256:b2e0afbea858a1be9f4cc35e7b9b3dbce46c8bd8dd4f5946a1de650a6afcd617"}, - {file = "mypy_boto3_sts-1.20.1-py3-none-any.whl", hash = "sha256:261a6febafcde2ad8554b2a37f60396edd51af01143e3b98e4e94a581ef14226"}, + {file = "mypy-boto3-sts-1.20.12.tar.gz", hash = "sha256:de14a4c82bd3e7d3aaae0aa3cb43b712ef454e9cf4246efa213e09a9e678bb95"}, + {file = "mypy_boto3_sts-1.20.12-py3-none-any.whl", hash = "sha256:787b9021d3b823714f38ecab23ca19f64867ad2d38eeab9cd758d63bdefdb502"}, ] mypy-boto3-support = [ - {file = "mypy-boto3-support-1.20.1.tar.gz", hash = "sha256:e93ec71141e9621e79e0be8728794114b80e6c7e49e22d9e5fef5cba0875c1a2"}, - {file = "mypy_boto3_support-1.20.1-py3-none-any.whl", hash = "sha256:af448053d2de0fafec1bc0f231d8ec2624bb4f9c12785af2cf1a17c8e5b6165c"}, + {file = "mypy-boto3-support-1.20.22.tar.gz", hash = "sha256:65d8c19ada2464ef7902e54075611b219e41633a865aa8743ac86844d1cccdb0"}, + {file = "mypy_boto3_support-1.20.22-py3-none-any.whl", hash = "sha256:a7fd3991a3db6c68942d81a239a78f5aeb3887576bbb325bd73c9b202829a2d2"}, ] mypy-boto3-swf = [ {file = "mypy-boto3-swf-1.20.1.tar.gz", hash = "sha256:ad847e5d5d6523ba5a2c2ee2fa636d37c4dbaa53c50c5534604040c1b540d7b5"}, @@ -5655,16 +5768,16 @@ mypy-boto3-synthetics = [ {file = "mypy_boto3_synthetics-1.20.1-py3-none-any.whl", hash = "sha256:cde898aee47f3804d77c1af71ac58943e3cac5dd238305d5b6a3c952d9e0101b"}, ] mypy-boto3-textract = [ - {file = "mypy-boto3-textract-1.20.1.tar.gz", hash = "sha256:dc8d2490a6f9034142a6867353c07d494bc5109c1e64fd88334a4627bfa284f1"}, - {file = "mypy_boto3_textract-1.20.1-py3-none-any.whl", hash = "sha256:fab708cf2d4641c1c565fab1b7f44f70f3fa44ca7f123f7177fb58aaf31602b2"}, + {file = "mypy-boto3-textract-1.20.15.tar.gz", hash = "sha256:a59c7894f4a72c983dc4a73f0f3bec64d0d5de50a4cebe3ab06fe0c1e416c651"}, + {file = "mypy_boto3_textract-1.20.15-py3-none-any.whl", hash = "sha256:8f73fde9c4965e9fa4a25197b14a2afd03a625fc28d57df6e6b7e367384f98c2"}, ] mypy-boto3-timestream-query = [ - {file = "mypy-boto3-timestream-query-1.20.1.tar.gz", hash = "sha256:48fa87b13e96c59eedac5ff36998f5d6a9092a10c87fed566281459ed0bf7c93"}, - {file = "mypy_boto3_timestream_query-1.20.1-py3-none-any.whl", hash = "sha256:20950fd608ddda653c7bf493363e21e947274583c8b1f06a1a302a10d57f4a0c"}, + {file = "mypy-boto3-timestream-query-1.20.13.tar.gz", hash = "sha256:4720f2b3e66cee8c38143c447c80731cc6eb805e3d985b5e6b6da0b3e93c2104"}, + {file = "mypy_boto3_timestream_query-1.20.13-py3-none-any.whl", hash = "sha256:f9ab418143c97cdda8a99f92ff4314ce0e01067de3add027b20a501911b42bba"}, ] mypy-boto3-timestream-write = [ - {file = "mypy-boto3-timestream-write-1.20.1.tar.gz", hash = "sha256:7ba259c72cd7a706d79d334f44257ce0645930f16e1d8997180c5a39d6cbbddd"}, - {file = "mypy_boto3_timestream_write-1.20.1-py3-none-any.whl", hash = "sha256:de05bb182889ef93496e5a988c86662c0344548e54399adc3db5520835e75e0f"}, + {file = "mypy-boto3-timestream-write-1.20.13.tar.gz", hash = "sha256:84784395fc855f2c324f03df2a8ca54e71f8e6307c5d570373d6e108619997d9"}, + {file = "mypy_boto3_timestream_write-1.20.13-py3-none-any.whl", hash = "sha256:afeba4086ccff4f6c81dd78aa99a1da51002526cf32e2cd69a319179cc3563b1"}, ] mypy-boto3-transcribe = [ {file = "mypy-boto3-transcribe-1.20.1.tar.gz", hash = "sha256:0a8158148d628b74e15a4980e68c36b181a7c77122aee03a84bea868c3d37959"}, @@ -5675,8 +5788,8 @@ mypy-boto3-transfer = [ {file = "mypy_boto3_transfer-1.20.6-py3-none-any.whl", hash = "sha256:2cb8b47bcdd7fa15afd6adf831d7aef6095f465df9b8317f5860ecbd64eb9f88"}, ] mypy-boto3-translate = [ - {file = "mypy-boto3-translate-1.20.4.tar.gz", hash = "sha256:5ca5a36df01b70248b528bf83b08638c071e4e0819ab789230efa0d2ab922cc5"}, - {file = "mypy_boto3_translate-1.20.4-py3-none-any.whl", hash = "sha256:525b400bc606e6db3cbd141082b3203b03e176d6e80cbd508709218de8bdaa36"}, + {file = "mypy-boto3-translate-1.20.13.tar.gz", hash = "sha256:751cdc58d4ca068d7a429e36aa043d0e6315bc9b57ecdefb03dffd9a87086b0d"}, + {file = "mypy_boto3_translate-1.20.13-py3-none-any.whl", hash = "sha256:2a78b3ddd8554ed6195a45b30d3ee4d75a1f428392089f0883d0b1fb6233f334"}, ] mypy-boto3-voice-id = [ {file = "mypy-boto3-voice-id-1.20.1.tar.gz", hash = "sha256:b84b2acc76b91a3378c384986baead9996d2d44feca67d158cb7555d479f46cf"}, @@ -5695,8 +5808,8 @@ mypy-boto3-wafv2 = [ {file = "mypy_boto3_wafv2-1.20.6-py3-none-any.whl", hash = "sha256:5bc85604cab6d21e60394dff04c43f4d17d125b13ed78651c31ca267aadb8599"}, ] mypy-boto3-wellarchitected = [ - {file = "mypy-boto3-wellarchitected-1.20.1.tar.gz", hash = "sha256:dea90a239683324af26be8a57873e6658bdebbe90b6f9f212a710e86d94d9a66"}, - {file = "mypy_boto3_wellarchitected-1.20.1-py3-none-any.whl", hash = "sha256:c8b36b76b6dcd12a3fbe71b69aa223a63589ab2199300076557042cb7d855c5c"}, + {file = "mypy-boto3-wellarchitected-1.20.16.tar.gz", hash = "sha256:91f274daaf30e2e439cabef6e0eac9b0e4a4a05f63fea6d9204a632e93c36f79"}, + {file = "mypy_boto3_wellarchitected-1.20.16-py3-none-any.whl", hash = "sha256:f312f68a66c8b52ad530db4c8d6d0ee46ccf14ce46f469f3e0110b2b78f49c5b"}, ] mypy-boto3-wisdom = [ {file = "mypy-boto3-wisdom-1.20.1.tar.gz", hash = "sha256:49a2d775b83c2f823864d8ffe3fd993f5ec2bc8deeece8b9db4e554c099701e7"}, @@ -5719,8 +5832,12 @@ mypy-boto3-workmailmessageflow = [ {file = "mypy_boto3_workmailmessageflow-1.20.1-py3-none-any.whl", hash = "sha256:32b2ed2afd0ada1ed3be9062d9a77211a670ae40521d2d043b5112a796aceded"}, ] mypy-boto3-workspaces = [ - {file = "mypy-boto3-workspaces-1.20.1.tar.gz", hash = "sha256:528829c23dcec1354b262fd16616b1dfccf6081fec56c452e53ef96cc4b53f69"}, - {file = "mypy_boto3_workspaces-1.20.1-py3-none-any.whl", hash = "sha256:39b2378d3ac10f1f41a3111d8b7435b53f66c4b15254f126342c255d16a1fb90"}, + {file = "mypy-boto3-workspaces-1.20.12.tar.gz", hash = "sha256:aada548a9f56a79f28e74b15e48b82b65705e22fca7bc6c2dfd99236e5db9fd8"}, + {file = "mypy_boto3_workspaces-1.20.12-py3-none-any.whl", hash = "sha256:80fb3702a30057dde09b6a813e73f71d34e703e222c9238ea8e17dddd1aed61d"}, +] +mypy-boto3-workspaces-web = [ + {file = "mypy-boto3-workspaces-web-1.20.17.tar.gz", hash = "sha256:c5a9804ee1009415b44f825842c5a01bf36ec52ddc6a09ab0b0aefd183922fd0"}, + {file = "mypy_boto3_workspaces_web-1.20.17-py3-none-any.whl", hash = "sha256:0febf542616356f9c694fccc3f7f74cf3ebc08de8811211a0a5cdd72483cb4b8"}, ] mypy-boto3-xray = [ {file = "mypy-boto3-xray-1.20.1.tar.gz", hash = "sha256:3d5c6d0be7af0165879a9bccec62b684c957a1fa3e6dceb2f558a8640b44501c"}, @@ -5779,8 +5896,8 @@ pylev = [ {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, ] pylic = [ - {file = "pylic-2.1.0-py3-none-any.whl", hash = "sha256:40becc545f841dc66779a478321e9430756546e6843f348eea7a95a66d9a6aca"}, - {file = "pylic-2.1.0.tar.gz", hash = "sha256:0d927629cff3771b3f81842ded334eb07d610cd31b9c93957a73dc35a85f6440"}, + {file = "pylic-2.2.0-py3-none-any.whl", hash = "sha256:14b014852b5aa76230a52568da3b0ca4e1f8d7e6a4cc89137da70564237cc8bd"}, + {file = "pylic-2.2.0.tar.gz", hash = "sha256:1fdf980c69b2edcdeb9669b0a1574f55da2560059864dc8c81cbee3dcbd8d225"}, ] pyparsing = [ {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, @@ -5795,16 +5912,16 @@ pytest-cov = [ {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, ] pytest-forked = [ - {file = "pytest-forked-1.3.0.tar.gz", hash = "sha256:6aa9ac7e00ad1a539c41bec6d21011332de671e938c7637378ec9710204e37ca"}, - {file = "pytest_forked-1.3.0-py2.py3-none-any.whl", hash = "sha256:dc4147784048e70ef5d437951728825a131b81714b398d5d52f17c7c144d8815"}, + {file = "pytest-forked-1.4.0.tar.gz", hash = "sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e"}, + {file = "pytest_forked-1.4.0-py3-none-any.whl", hash = "sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8"}, ] pytest-mock = [ {file = "pytest-mock-3.6.1.tar.gz", hash = "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62"}, {file = "pytest_mock-3.6.1-py3-none-any.whl", hash = "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3"}, ] pytest-xdist = [ - {file = "pytest-xdist-2.4.0.tar.gz", hash = "sha256:89b330316f7fc475f999c81b577c2b926c9569f3d397ae432c0c2e2496d61ff9"}, - {file = "pytest_xdist-2.4.0-py3-none-any.whl", hash = "sha256:7b61ebb46997a0820a263553179d6d1e25a8c50d8a8620cd1aa1e20e3be99168"}, + {file = "pytest-xdist-2.5.0.tar.gz", hash = "sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf"}, + {file = "pytest_xdist-2.5.0-py3-none-any.whl", hash = "sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65"}, ] python-dateutil = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, @@ -5845,57 +5962,6 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -regex = [ - {file = "regex-2021.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf"}, - {file = "regex-2021.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f"}, - {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965"}, - {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667"}, - {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36"}, - {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f"}, - {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0"}, - {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4"}, - {file = "regex-2021.11.10-cp310-cp310-win32.whl", hash = "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a"}, - {file = "regex-2021.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12"}, - {file = "regex-2021.11.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc"}, - {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0"}, - {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30"}, - {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345"}, - {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733"}, - {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23"}, - {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e"}, - {file = "regex-2021.11.10-cp36-cp36m-win32.whl", hash = "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4"}, - {file = "regex-2021.11.10-cp36-cp36m-win_amd64.whl", hash = "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e"}, - {file = "regex-2021.11.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e"}, - {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36"}, - {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d"}, - {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8"}, - {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a"}, - {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e"}, - {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f"}, - {file = "regex-2021.11.10-cp37-cp37m-win32.whl", hash = "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec"}, - {file = "regex-2021.11.10-cp37-cp37m-win_amd64.whl", hash = "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4"}, - {file = "regex-2021.11.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83"}, - {file = "regex-2021.11.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244"}, - {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50"}, - {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646"}, - {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb"}, - {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec"}, - {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe"}, - {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94"}, - {file = "regex-2021.11.10-cp38-cp38-win32.whl", hash = "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc"}, - {file = "regex-2021.11.10-cp38-cp38-win_amd64.whl", hash = "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d"}, - {file = "regex-2021.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b"}, - {file = "regex-2021.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d"}, - {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7"}, - {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc"}, - {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb"}, - {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449"}, - {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b"}, - {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef"}, - {file = "regex-2021.11.10-cp39-cp39-win32.whl", hash = "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a"}, - {file = "regex-2021.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29"}, - {file = "regex-2021.11.10.tar.gz", hash = "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6"}, -] requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, diff --git a/pyproject.toml b/pyproject.toml index 2e0c0d56..90b519f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_sra_examples" -version = "1.2.1" +version = "1.3.0" description = "AWS Security Reference Architecture Examples" authors = ["Amazon Web Services "]