

# 스택 배포 검증
<a name="validate-stack-deployments"></a>

사전 배포 검증을 통해 CloudFormation 변경 세트를 실행하기 전에 잠재적 배포 문제를 식별하고 해결할 수 있습니다. 이 기능은 일반적인 장애 시나리오에 대해 템플릿을 검증하므로 개발 주기 초반에 문제를 감지하는 데 도움이 됩니다.

**Topics**
+ [사전 배포 검증 작동 방식](#validate-stack-deployments-how-it-works)
+ [고려 사항](#validate-stack-deployments-considerations)
+ [사전 조건](#validate-stack-deployments-prerequisites)
+ [스택 배포 검증(콘솔)](#validate-stack-deployments-console)
+ [스택 배포 검증(AWS CLI)](#validate-stack-deployments-cli)
+ [검증 유형](#validate-stack-deployments-validation-types)
+ [리소스 제한 사항](#validate-stack-deployments-resource-limitations)

## 사전 배포 검증 작동 방식
<a name="validate-stack-deployments-how-it-works"></a>

사전 배포 검증에는 다음 단계가 포함됩니다.

1. **변경 세트 생성** - 일반적으로 CloudFormation 스택 업데이트와 같이 변경 세트를 생성합니다. 변경 세트를 생성할 때 사전 배포 검증이 기본적으로 활성화됩니다.

1. **검증 실행** - CloudFormation은 템플릿 및 대상 환경에 대해 여러 검증 검사를 실행합니다. 현재 3가지 유형의 검증이 지원됩니다. 리소스 스키마에 대한 속성 구문 검증, 기존 리소스와의 리소스 이름 충돌 감지, 삭제 작업에 대한 S3 버킷 비어 있음 검증이 이에 해당합니다.

1. **검증 결과 검토** - CloudFormation은 템플릿에서 문제 위치를 정확히 식별하는 정확한 경로를 포함하여 발견된 모든 문제에 대한 자세한 피드백을 제공함으로써 수동 템플릿 디버깅을 수행하지 않아도 됩니다.

1. **문제 해결** - 배포를 진행하기 전에 템플릿을 업데이트하거나 충돌을 해결하여 식별된 문제를 해결합니다.

1. **자신 있게 실행** - 일반적인 장애 시나리오가 미리 검증되었음을 알고 변경 세트를 배포합니다.

## 고려 사항
<a name="validate-stack-deployments-considerations"></a>

사전 배포 검증을 사용할 경우 다음 사항에 유의하세요.
+ 사전 배포 검증은 세 가지 일반적인 배포 장애 시나리오에 중점을 둡니다. 배포의 성공을 보장하지는 않지만 일반적인 장애의 가능성을 줄입니다.
+ 다음과 같이 검증 모드는 서로 다르게 작동합니다.
  + **FAIL 모드**에서는 검증에서 오류를 감지하면 변경 세트 실행을 방지하여 문제가 있는 템플릿을 배포하지 않도록 합니다. 이는 속성 구문 오류 및 리소스 이름 충돌에 적용됩니다.
  + **WARN 모드**에서는 검증 실패에도 불구하고 변경 세트를 생성하며 개발자가 실행 전에 검토하고 해결할 수 있는 경고를 제공합니다. 수동 개입을 통해 해결할 수 있는 S3 버킷 비어 있음과 같은 제약 조건 위반에 적용됩니다.
+ 검증 결과는 특정 변경 세트와 연결됩니다. 템플릿을 수정하는 경우 업데이트된 검증 결과를 얻으려면 새 변경 세트를 생성해야 합니다.
+ S3 버킷 검증은 객체 존재만 확인하며 삭제를 방지할 수 있는 버킷 정책 또는 기타 제약 조건은 확인하지 않습니다.

## 사전 조건
<a name="validate-stack-deployments-prerequisites"></a>

사전 배포 검증을 사용하려면 다음이 필요합니다.
+ 계정에서 변경 세트를 생성하고 리소스를 읽는 데 필요한 IAM 권한. S3 버킷 비어 있음 검사의 경우 `s3:ListBucket` 권한이 필요합니다.
+ 스택이 배포된 AWS 리전에 대한 액세스 권한.
+ 배포 전에 검증하려는 CloudFormation 템플릿.

## 스택 배포 검증(콘솔)
<a name="validate-stack-deployments-console"></a>

콘솔에서 다음 절차를 통해 스택 배포를 검증합니다.

**배포 전에 템플릿을 검증하는 방법**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)에서 CloudFormation 콘솔을 엽니다.

1. 화면 상단의 탐색 모음에서 스택이 위치한 AWS 리전을 선택하세요.

1. **스택** 페이지에서 변경 세트를 생성하려는 실행 중인 스택을 선택합니다.

1. 스택 세부 정보 창에서 **스택 업데이트**를 선택하고 **변경 세트 생성**을 선택하세요.

1. ***stack-name*에 대한 변경 세트 생성** 페이지에서 업데이트된 템플릿을 업로드하거나 템플릿 소스를 지정하세요.

1. **다음**을 선택하여 나머지 변경 세트 구성 단계를 진행하세요.

1. 템플릿에 IAM 리소스가 포함된 경우 **기능**에서 **CloudFormation에서 IAM 리소스를 생성할 수 있음을 확인함**을 선택합니다. IAM 리소스는 AWS 계정의 권한을 수정할 수 있습니다. 이러한 리소스를 검토하여 의도한 작업만 허용하는지 확인하세요. 자세한 내용은 [CloudFormation 템플릿에서 IAM 리소스 승인](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/control-access-with-iam.html#using-iam-capabilities)을 참조하세요.

1. **검토 및 생성** 페이지에서 **변경 세트 생성**을 선택하세요.

1. CloudFormation은 변경 세트를 생성하고 검증 검사를 실행합니다. **배포 검증** 탭에서 검증 결과를 검토하세요.

1. 검증에 통과하거나 경고에 만족하는 경우 **변경 세트 실행**을 선택하여 변경 내용을 배포하세요.

1. 검증에 실패하면 문제를 해결하고 새 변경 세트를 생성하여 배포를 다시 검증하세요.

## 스택 배포 검증(AWS CLI)
<a name="validate-stack-deployments-cli"></a>

사전 배포 검증을 위한 AWS CLI 명령은 다음을 포함합니다.
+ [create-change-set](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html): 변경 세트 생성 중 자동 검증.
+ [describe-change-set](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html): 변경 세트 상태 확인
+ [describe-events](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-events.html): 검증 결과 검토.

AWS CLI를 사용하여 다음 절차를 통해 스택 배포를 검증합니다.

**배포 전에 템플릿을 검증하는 방법**

1. [create-stack-set](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html) 명령을 사용하세요.

   ```
   aws cloudformation create-change-set \
     --stack-name MyStack \
     --change-set-name MyChangeSet \
     --change-set-type "CREATE" \
     --template-body file://updated-template.yaml
   ```

   명령은 변경 세트 ARN 및 스택 ARN을 모두 반환하세요.

1. [describe-events](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-events.html) 명령을 변경 세트 ARN 또는 변경 세트 이름과 함께 사용하여 검증 상태 및 결과를 검토하세요.

   ```
   aws cloudformation describe-events \
     --change-set-name "arn:aws:cloudformation:us-east-1:123456789012:changeSet/MyChangeSet/94498df5-1afb-43b1-9869-9f82b2d877ac"
   ```

   검증 오류 출력 예제:

   ```
   {
      "OperationEvents":[
         {
            "EventId":"9b5c9a29-4704-4ad0-8082-afb49418d55b",
            "StackId":"arn:aws:cloudformation:us-east-1:123456789012:stack/MyStack/c3908380-b357-11f0-a97f-0ad08f35df65",
            "OperationId":"f558b823-e1e3-4de3-a222-e6b930ddcad4",
            "OperationType":"CREATE_CHANGESET",
            "OperationStatus":"FAILED",
            "EventType":"STACK_EVENT",
            "Timestamp":"2025-10-27T17:10:02.923Z",
            "StartTime":"2025-10-27T17:09:57.537Z",
            "EndTime":"2025-10-27T17:10:02.923Z"
         },
         {
            "EventId":"2d8c3262-3468-4283-82fb-6e780e9e4f1d",
            "StackId":"arn:aws:cloudformation:us-east-1:123456789012:stack/MyStack/c3908380-b357-11f0-a97f-0ad08f35df65",
            "OperationId":"f558b823-e1e3-4de3-a222-e6b930ddcad4",
            "OperationType":"CREATE_CHANGESET",
            "EventType":"VALIDATION_ERROR",
            "LogicalResourceId":"NotificationBucket",
            "PhysicalResourceId":"",
            "ResourceType":"AWS::S3::Bucket",
            "Timestamp":"2025-10-27T17:10:02.461Z",
            "ValidationFailureMode":"FAIL",
            "ValidationName":"PROPERTY_VALIDATION",
            "ValidationStatus":"FAILED",
            "ValidationStatusReason":"#/NotificationConfiguration/QueueConfigurations/0: required key [Event] not found",
            "ValidationPath":"/Resources/NotificationBucket/Properties/NotificationConfiguration/QueueConfigurations/0"
         }
      ]
   }
   ```

1. 템플릿을 업데이트하여 검증 오류를 해결한 다음 새 변경 세트를 생성하세요.

1. 검증에 통과되면 변경 세트를 실행하세요.

   ```
   aws cloudformation execute-change-set \
     --change-set-name MyChangeSet \
     --stack-name MyStack
   ```

## 검증 유형
<a name="validate-stack-deployments-validation-types"></a>

사전 배포 검증에는 다음과 같은 유형의 검사가 포함됩니다.
+ **속성 구문 검증** - AWS 리소스 스키마를 기준으로 리소스 속성을 검증합니다. 필요한 속성과 유효한 속성 값을 확인하고 더 이상 사용되지 않거나 지원되지 않는 속성 조합을 식별합니다.
+ **리소스 이름 충돌 감지** - 기존 AWS 리소스와의 이름 충돌이 있는지 확인합니다. 리소스 이름이 AWS 이름 지정 요구 사항을 충족하는지 검증하고 배포 시도 전에 잠재적 충돌을 식별합니다.
+ **S3 버킷 비어 있음 검증** - 객체가 포함된 S3 버킷을 삭제하려고 할 때 경고합니다. 삭제 영향을 평가하고 일반적인 S3 삭제 실패를 방지하는 데 도움이 되도록 객체 수를 제공합니다.

각 검증 유형은 문제를 신속하게 해결하는 데 도움이 되도록 템플릿에 특정 오류 메시지와 오류 위치를 함께 제공합니다.

## 리소스 제한 사항
<a name="validate-stack-deployments-resource-limitations"></a>

사전 배포 검증에 대해서는 다음 리소스 유형이 지원되지 않습니다.
+ `AWS::ApiGatewayV2::ApiGatewayManagedOverrides`
+ `AWS::ApiGatewayV2::Stage`
+ `AWS::AppMesh::GatewayRoute`
+ `AWS::AppMesh::Mesh`
+ `AWS::AppMesh::Route`
+ `AWS::AppMesh::VirtualGateway`
+ `AWS::AppMesh::VirtualNode`
+ `AWS::AppMesh::VirtualRouter`
+ `AWS::AppMesh::VirtualService`
+ `AWS::AppStream::Fleet`
+ `AWS::AppStream::Stack`
+ `AWS::AppStream::StackFleetAssociation`
+ `AWS::AppStream::StackUserAssociation`
+ `AWS::AppStream::User`
+ `AWS::AppSync::ApiCache`
+ `AWS::AppSync::ApiKey`
+ `AWS::AppSync::GraphQLSchema`
+ `AWS::AutoScalingPlans::ScalingPlan`
+ `AWS::Budgets::Budget`
+ `AWS::CertificateManager::Certificate`
+ `AWS::Cloud9::EnvironmentEC2`
+ `AWS::CloudFormation::CustomResource`
+ `AWS::CloudFormation::Macro`
+ `AWS::CloudFormation::WaitCondition`
+ `AWS::CloudFormation::WaitConditionHandle`
+ `AWS::CloudFront::StreamingDistribution`
+ `AWS::CloudWatch::AnomalyDetector`
+ `AWS::CloudWatch::InsightRule`
+ `AWS::CodeBuild::Project`
+ `AWS::CodeBuild::ReportGroup`
+ `AWS::CodeBuild::SourceCredential`
+ `AWS::CodeCommit::Repository`
+ `AWS::CodeDeploy::DeploymentGroup`
+ `AWS::CodeStar::GitHubRepository`
+ `AWS::Config::ConfigurationRecorder`
+ `AWS::Config::DeliveryChannel`
+ `AWS::Config::OrganizationConfigRule`
+ `AWS::Config::RemediationConfiguration`
+ `AWS::DAX::Cluster`
+ `AWS::DAX::ParameterGroup`
+ `AWS::DAX::SubnetGroup`
+ `AWS::DirectoryService::MicrosoftAD`
+ `AWS::DLM::LifecyclePolicy`
+ `AWS::DMS::Certificate`
+ `AWS::DMS::Endpoint`
+ `AWS::DMS::EventSubscription`
+ `AWS::DMS::ReplicationInstance`
+ `AWS::DMS::ReplicationSubnetGroup`
+ `AWS::DMS::ReplicationTask`
+ `AWS::DocDB::DBCluster`
+ `AWS::DocDB::DBClusterParameterGroup`
+ `AWS::DocDB::DBInstance`
+ `AWS::DocDB::DBSubnetGroup`
+ `AWS::DocDB::EventSubscription`
+ `AWS::EC2::ClientVpnAuthorizationRule`
+ `AWS::EC2::ClientVpnEndpoint`
+ `AWS::EC2::ClientVpnRoute`
+ `AWS::EC2::ClientVpnTargetNetworkAssociation`
+ `AWS::EC2::NetworkInterfacePermission`
+ `AWS::ElastiCache::CacheCluster`
+ `AWS::ElastiCache::ReplicationGroup`
+ `AWS::ElastiCache::SecurityGroup`
+ `AWS::ElastiCache::SecurityGroupIngress`
+ `AWS::ElasticLoadBalancing::LoadBalancer`
+ `AWS::ElasticLoadBalancingV2::ListenerCertificate`
+ `AWS::Elasticsearch::Domain`
+ `AWS::EMR::Cluster`
+ `AWS::EMR::InstanceFleetConfig`
+ `AWS::EMR::InstanceGroupConfig`
+ `AWS::FSx::FileSystem`
+ `AWS::FSx::Snapshot`
+ `AWS::FSx::StorageVirtualMachine`
+ `AWS::FSx::Volume`
+ `AWS::Glue::Classifier`
+ `AWS::Glue::Connection`
+ `AWS::Glue::CustomEntityType`
+ `AWS::Glue::DataCatalogEncryptionSettings`
+ `AWS::Glue::DataQualityRuleset`
+ `AWS::Glue::DevEndpoint`
+ `AWS::Glue::MLTransform`
+ `AWS::Glue::Partition`
+ `AWS::Glue::SecurityConfiguration`
+ `AWS::Glue::Table`
+ `AWS::Glue::TableOptimizer`
+ `AWS::Glue::Workflow`
+ `AWS::Greengrass::ConnectorDefinition`
+ `AWS::Greengrass::ConnectorDefinitionVersion`
+ `AWS::Greengrass::CoreDefinition`
+ `AWS::Greengrass::CoreDefinitionVersion`
+ `AWS::Greengrass::DeviceDefinition`
+ `AWS::Greengrass::DeviceDefinitionVersion`
+ `AWS::Greengrass::FunctionDefinition`
+ `AWS::Greengrass::FunctionDefinitionVersion`
+ `AWS::Greengrass::Group`
+ `AWS::Greengrass::GroupVersion`
+ `AWS::Greengrass::LoggerDefinition`
+ `AWS::Greengrass::LoggerDefinitionVersion`
+ `AWS::Greengrass::ResourceDefinition`
+ `AWS::Greengrass::ResourceDefinitionVersion`
+ `AWS::Greengrass::SubscriptionDefinition`
+ `AWS::Greengrass::SubscriptionDefinitionVersion`
+ `AWS::IAM::AccessKey`
+ `AWS::IAM::UserToGroupAddition`
+ `AWS::IoT::PolicyPrincipalAttachment`
+ `AWS::IoT::ThingPrincipalAttachment`
+ `AWS::IoTThingsGraph::FlowTemplate`
+ `AWS::KinesisAnalytics::Application`
+ `AWS::KinesisAnalytics::ApplicationOutput`
+ `AWS::KinesisAnalytics::ApplicationReferenceDataSource`
+ `AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption`
+ `AWS::KinesisAnalyticsV2::ApplicationOutput`
+ `AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource`
+ `AWS::LakeFormation::DataLakeSettings`
+ `AWS::LakeFormation::Permissions`
+ `AWS::LakeFormation::Resource`
+ `AWS::ManagedBlockchain::Member`
+ `AWS::ManagedBlockchain::Node`
+ `AWS::MediaConvert::JobTemplate`
+ `AWS::MediaConvert::Preset`
+ `AWS::MediaConvert::Queue`
+ `AWS::MediaLive::Channel`
+ `AWS::MediaLive::Input`
+ `AWS::MediaLive::InputSecurityGroup`
+ `AWS::MediaStore::Container`
+ `AWS::OpsWorks::App`
+ `AWS::OpsWorks::ElasticLoadBalancerAttachment`
+ `AWS::OpsWorks::Instance`
+ `AWS::OpsWorks::Layer`
+ `AWS::OpsWorks::Stack`
+ `AWS::OpsWorks::UserProfile`
+ `AWS::OpsWorks::Volume`
+ `AWS::Pinpoint::ADMChannel`
+ `AWS::Pinpoint::APNSChannel`
+ `AWS::Pinpoint::APNSSandboxChannel`
+ `AWS::Pinpoint::APNSVoipChannel`
+ `AWS::Pinpoint::APNSVoipSandboxChannel`
+ `AWS::Pinpoint::App`
+ `AWS::Pinpoint::ApplicationSettings`
+ `AWS::Pinpoint::BaiduChannel`
+ `AWS::Pinpoint::Campaign`
+ `AWS::Pinpoint::EmailChannel`
+ `AWS::Pinpoint::EmailTemplate`
+ `AWS::Pinpoint::EventStream`
+ `AWS::Pinpoint::GCMChannel`
+ `AWS::Pinpoint::PushTemplate`
+ `AWS::Pinpoint::Segment`
+ `AWS::Pinpoint::SMSChannel`
+ `AWS::Pinpoint::SmsTemplate`
+ `AWS::Pinpoint::VoiceChannel`
+ `AWS::PinpointEmail::ConfigurationSet`
+ `AWS::PinpointEmail::ConfigurationSetEventDestination`
+ `AWS::PinpointEmail::DedicatedIpPool`
+ `AWS::PinpointEmail::Identity`
+ `AWS::QLDB::Ledger`
+ `AWS::RDS::DBSecurityGroup`
+ `AWS::RDS::DBSecurityGroupIngress`
+ `AWS::Redshift::ClusterSecurityGroup`
+ `AWS::Redshift::ClusterSecurityGroupIngress`
+ `AWS::Route53::RecordSet`
+ `AWS::Route53::RecordSetGroup`
+ `AWS::SageMaker::CodeRepository`
+ `AWS::SageMaker::EndpointConfig`
+ `AWS::SageMaker::Model`
+ `AWS::SageMaker::NotebookInstance`
+ `AWS::SageMaker::NotebookInstanceLifecycleConfig`
+ `AWS::SageMaker::Workteam`
+ `AWS::SDB::Domain`
+ `AWS::ServiceCatalog::AcceptedPortfolioShare`
+ `AWS::ServiceCatalog::LaunchRoleConstraint`
+ `AWS::ServiceCatalog::Portfolio`
+ `AWS::ServiceCatalog::StackSetConstraint`
+ `AWS::ServiceDiscovery::HttpNamespace`
+ `AWS::ServiceDiscovery::Instance`
+ `AWS::ServiceDiscovery::PrivateDnsNamespace`
+ `AWS::ServiceDiscovery::PublicDnsNamespace`
+ `AWS::ServiceDiscovery::Service`
+ `AWS::SES::ReceiptFilter`
+ `AWS::SES::ReceiptRule`
+ `AWS::SES::ReceiptRuleSet`
+ `AWS::SSM::MaintenanceWindow`
+ `AWS::SSM::MaintenanceWindowTarget`
+ `AWS::SSM::MaintenanceWindowTask`
+ `AWS::WAF::ByteMatchSet`
+ `AWS::WAF::IPSet`
+ `AWS::WAF::Rule`
+ `AWS::WAF::SizeConstraintSet`
+ `AWS::WAF::SqlInjectionMatchSet`
+ `AWS::WAF::WebACL`
+ `AWS::WAF::XssMatchSet`
+ `AWS::WAFRegional::ByteMatchSet`
+ `AWS::WAFRegional::GeoMatchSet`
+ `AWS::WAFRegional::IPSet`
+ `AWS::WAFRegional::RateBasedRule`
+ `AWS::WAFRegional::RegexPatternSet`
+ `AWS::WAFRegional::Rule`
+ `AWS::WAFRegional::SizeConstraintSet`
+ `AWS::WAFRegional::SqlInjectionMatchSet`
+ `AWS::WAFRegional::WebACL`
+ `AWS::WAFRegional::WebACLAssociation`
+ `AWS::WAFRegional::XssMatchSet`
+ `AWS::WorkSpaces::Workspace`
+ `AWS::AmazonMQ::ConfigurationAssociation`
+ `AWS::ApiGateway::DomainNameAccessAssociation`
+ `AWS::AppConfig::ExtensionAssociation`
+ `AWS::AppStream::ApplicationEntitlementAssociation`
+ `AWS::AppStream::ApplicationFleetAssociation`
+ `AWS::AppSync::DomainNameApiAssociation`
+ `AWS::AppSync::SourceApiAssociation`
+ `AWS::CleanRooms::ConfiguredTableAssociation`
+ `AWS::CleanRooms::IdNamespaceAssociation`
+ `AWS::CodeGuruReviewer::RepositoryAssociation`
+ `AWS::Cognito::IdentityPoolRoleAttachment`
+ `AWS::Cognito::UserPoolRiskConfigurationAttachment`
+ `AWS::Cognito::UserPoolUICustomizationAttachment`
+ `AWS::Cognito::UserPoolUserToGroupAttachment`
+ `AWS::Connect::IntegrationAssociation`
+ `AWS::Deadline::QueueFleetAssociation`
+ `AWS::Deadline::QueueLimitAssociation`
+ `AWS::EC2::EIPAssociation`
+ `AWS::EC2::EnclaveCertificateIamRoleAssociation`
+ `AWS::EC2::GatewayRouteTableAssociation`
+ `AWS::EC2::IPAMResourceDiscoveryAssociation`
+ `AWS::EC2::IpPoolRouteTableAssociation`
+ `AWS::EC2::LocalGatewayRouteTableVPCAssociation`
+ `AWS::EC2::LocalGatewayRouteTableVirtualInterfaceGroupAssociation`
+ `AWS::EC2::NetworkInterfaceAttachment`
+ `AWS::EC2::RouteServerAssociation`
+ `AWS::EC2::SecurityGroupVpcAssociation`
+ `AWS::EC2::SubnetNetworkAclAssociation`
+ `AWS::EC2::SubnetRouteTableAssociation`
+ `AWS::EC2::TransitGatewayAttachment`
+ `AWS::EC2::TransitGatewayMulticastDomainAssociation`
+ `AWS::EC2::TransitGatewayPeeringAttachment`
+ `AWS::EC2::TransitGatewayRouteTableAssociation`
+ `AWS::EC2::TransitGatewayVpcAttachment`
+ `AWS::EC2::VPCDHCPOptionsAssociation`
+ `AWS::EC2::VPCGatewayAttachment`
+ `AWS::EC2::VolumeAttachment`
+ `AWS::ECS::ClusterCapacityProviderAssociations`
+ `AWS::EKS::PodIdentityAssociation`
+ `AWS::FSx::DataRepositoryAssociation`
+ `AWS::FSx::S3AccessPointAttachment`
+ `AWS::GlobalAccelerator::CrossAccountAttachment`
+ `AWS::LakeFormation::TagAssociation`
+ `AWS::NetworkFirewall::VpcEndpointAssociation`
+ `AWS::NetworkManager::ConnectAttachment`
+ `AWS::NetworkManager::CustomerGatewayAssociation`
+ `AWS::NetworkManager::DirectConnectGatewayAttachment`
+ `AWS::NetworkManager::LinkAssociation`
+ `AWS::NetworkManager::SiteToSiteVpnAttachment`
+ `AWS::NetworkManager::TransitGatewayRouteTableAttachment`
+ `AWS::NetworkManager::VpcAttachment`
+ `AWS::Notifications::ChannelAssociation`
+ `AWS::Notifications::ManagedNotificationAccountContactAssociation`
+ `AWS::Notifications::ManagedNotificationAdditionalChannelAssociation`
+ `AWS::Notifications::OrganizationalUnitAssociation`
+ `AWS::ResourceExplorer2::DefaultViewAssociation`
+ `AWS::Route53Profiles::ProfileAssociation`
+ `AWS::Route53Profiles::ProfileResourceAssociation`
+ `AWS::Route53Resolver::FirewallRuleGroupAssociation`
+ `AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation`
+ `AWS::Route53Resolver::ResolverRuleAssociation`
+ `AWS::SSM::Association`
+ `AWS::SecretsManager::SecretTargetAttachment`
+ `AWS::SecurityHub::PolicyAssociation`
+ `AWS::ServiceCatalog::PortfolioPrincipalAssociation`
+ `AWS::ServiceCatalog::PortfolioProductAssociation`
+ `AWS::ServiceCatalog::ServiceActionAssociation`
+ `AWS::ServiceCatalog::TagOptionAssociation`
+ `AWS::ServiceCatalogAppRegistry::AttributeGroupAssociation`
+ `AWS::ServiceCatalogAppRegistry::ResourceAssociation`
+ `AWS::VpcLattice::ServiceNetworkResourceAssociation`
+ `AWS::VpcLattice::ServiceNetworkServiceAssociation`
+ `AWS::VpcLattice::ServiceNetworkVpcAssociation`
+ `AWS::WAFv2::WebACLAssociation`
+ `AWS::Wisdom::AssistantAssociation`
+ `AWS::WorkspacesInstances::VolumeAssociation`
+ `AWS::IAM::Policy`
+ `AWS::SNS::TopicPolicy`
+ `AWS::SQS::QueuePolicy`
+ `AWS::EC2::NetworkAclEntry`
+ `AWS::EC2::VPNGatewayRoutePropagation`
+ `AWS::CloudFormation::Stack`
+ `AWS::CloudWatch::MetricStream`
+ `AWS::WorkSpaces::ConnectionAlias`
+ `AWS::IoT::ProvisioningTemplate`
+ `AWS::MediaPackage::Channel`
+ `AWS::CloudFront::OriginRequestPolicy`
+ `AWS::Route53Resolver::ResolverQueryLoggingConfig`
+ `AWS::NetworkManager::TransitGatewayRegistration`
+ `AWS::ImageBuilder::Image`
+ `AWS::Config::ConformancePack`
+ `AWS::S3::AccessPoint`
+ `AWS::CodeStarConnections::Connection`
+ `AWS::CloudFront::CachePolicy`
+ `AWS::FMS::NotificationChannel`
+ `AWS::ImageBuilder::InfrastructureConfiguration`
+ `AWS::Detective::Graph`
+ `AWS::EC2::CarrierGateway`
+ `AWS::CloudWatch::CompositeAlarm`
+ `AWS::CodeArtifact::Repository`
+ `AWS::GroundStation::DataflowEndpointGroup`
+ `AWS::ElasticLoadBalancingV2::Listener`
+ `AWS::ImageBuilder::ImageRecipe`
+ `AWS::NetworkManager::Device`
+ `AWS::Kendra::DataSource`
+ `AWS::Timestream::Database`
+ `AWS::CodeGuruProfiler::ProfilingGroup`
+ `AWS::Lambda::EventSourceMapping`
+ `AWS::ECR::Repository`
+ `AWS::WAFv2::IPSet`
+ `AWS::GameLift::Alias`
+ `AWS::IoTSiteWise::Asset`
+ `AWS::OpsWorksCM::Server`
+ `AWS::IoT::Authorizer`
+ `AWS::WAFv2::RuleGroup`
+ `AWS::NetworkManager::Site`
+ `AWS::ResourceGroups::Group`
+ `AWS::MediaPackage::PackagingConfiguration`
+ `AWS::ImageBuilder::ImagePipeline`
+ `AWS::ECS::TaskDefinition`
+ `AWS::Macie::CustomDataIdentifier`
+ `AWS::MediaPackage::OriginEndpoint`
+ `AWS::Logs::LogGroup`
+ `AWS::CodeArtifact::Domain`
+ `AWS::Kendra::Faq`
+ `AWS::ECS::TaskSet`
+ `AWS::WAFv2::RegexPatternSet`
+ `AWS::ECS::Cluster`
+ `AWS::SSO::Assignment`
+ `AWS::GlobalAccelerator::Listener`
+ `AWS::ServiceCatalog::CloudFormationProvisionedProduct`
+ `AWS::RDS::DBProxy`
+ `AWS::EC2::FlowLog`
+ `AWS::ImageBuilder::Component`
+ `AWS::CloudFront::RealtimeLogConfig`
+ `AWS::NetworkManager::GlobalNetwork`
+ `AWS::RDS::DBProxyTargetGroup`
+ `AWS::WAFv2::WebACL`
+ `AWS::IVS::StreamKey`
+ `AWS::IVS::PlaybackKeyPair`
+ `AWS::Macie::Session`
+ `AWS::Route53::HealthCheck`
+ `AWS::Synthetics::Canary`
+ `AWS::Lambda::CodeSigningConfig`
+ `AWS::EFS::AccessPoint`
+ `AWS::Timestream::Table`
+ `AWS::MediaPackage::PackagingGroup`
+ `AWS::ECS::PrimaryTaskSet`
+ `AWS::Config::ConfigurationAggregator`
+ `AWS::GroundStation::Config`
+ `AWS::IoTSiteWise::AssetModel`
+ `AWS::SES::ConfigurationSet`
+ `AWS::ImageBuilder::DistributionConfiguration`
+ `AWS::Config::OrganizationConformancePack`
+ `AWS::EC2::LocalGatewayRoute`
+ `AWS::KMS::Key`
+ `AWS::Detective::MemberInvitation`
+ `AWS::EKS::FargateProfile`
+ `AWS::MediaPackage::Asset`
+ `AWS::GlobalAccelerator::EndpointGroup`
+ `AWS::Macie::FindingsFilter`
+ `AWS::IoT::Certificate`
+ `AWS::SageMaker::MonitoringSchedule`
+ `AWS::IVS::Channel`
+ `AWS::Kendra::Index`
+ `AWS::EventSchemas::RegistryPolicy`
+ `AWS::KinesisFirehose::DeliveryStream`
+ `AWS::GlobalAccelerator::Accelerator`
+ `AWS::EC2::PrefixList`
+ `AWS::GameLift::GameServerGroup`
+ `AWS::NetworkManager::Link`
+ `AWS::EFS::FileSystem`
+ `AWS::Route53::HostedZone`
+ `AWS::GroundStation::MissionProfile`
+ `AWS::KMS::Alias`
+ `AWS::FMS::Policy`
+ `AWS::SSO::PermissionSet`
+ `AWS::StepFunctions::StateMachine`
+ `AWS::QLDB::Stream`
+ `AWS::IoTSiteWise::Gateway`
+ `AWS::ECS::Service`
+ `AWS::ECS::CapacityProvider`
+ `AWS::EC2::SecurityGroup`
+ `AWS::EC2::SecurityGroupIngress`
+ `AWS::EC2::SecurityGroupEgress`
+ `AWS::EC2::EC2Fleet`
+ `AWS::IAM::Group`
+ `AWS::IAM::Role`
+ `AWS::IAM::User`
+ `AWS::ApiGateway::GatewayResponse`
+ `AWS::S3::BucketPolicy`
+ `AWS::SNS::Topic`
+ `AWS::SNS::Subscription`
+ `AWS::RDS::DBInstance`
+ `AWS::RDS::DBParameterGroup`
+ `AWS::RDS::DBCluster`
+ `AWS::RDS::DBClusterParameterGroup`
+ `AWS::RDS::DBSubnetGroup`
+ `AWS::RDS::EventSubscription`
+ `AWS::RDS::GlobalCluster`
+ `AWS::RDS::OptionGroup`
+ `AWS::Neptune::DBInstance`
+ `AWS::Neptune::DBParameterGroup`
+ `AWS::Neptune::DBCluster`
+ `AWS::Neptune::DBClusterParameterGroup`
+ `AWS::Neptune::DBSubnetGroup`
+ `AWS::Redshift::Cluster`
+ `AWS::Redshift::ClusterParameterGroup`
+ `AWS::Redshift::ClusterSubnetGroup`
+ `AWS::Redshift::EndpointAccess`
+ `AWS::Redshift::EndpointAuthorization`
+ `AWS::Redshift::EventSubscription`
+ `AWS::Redshift::ScheduledAction`
+ `AWS::ElastiCache::SubnetGroup`