

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# CloudFormation 采集堆栈：CFN 验证器示例
<a name="ex-cfn-ingest-validator"></a>

这些示例可以帮助您准备模板以成功收录。

## 格式验证
<a name="cfn-validator-templates"></a>

验证模板是否包含 “资源” 部分，并且在其下定义的所有资源都具有 “类型” 值。

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description" : "Create a SNS topic",
  "Resources": {
    "SnsTopic": {
      "Type": "AWS::SNS::Topic"
    }
  }
}
```

验证是否允许使用模板的根密钥。允许的根密钥是：

```
[
  "AWSTemplateFormatVersion",  
  "Description",  
  "Mappings",  
  "Parameters",  
  "Conditions",  
  "Resources",  
  "Rules",  
  "Outputs",  
  "Metadata"
]
```

## 需要手动审核验证
<a name="cfn-validator-ex-man"></a>

如果模板包含以下资源，则自动验证将失败，您需要手动审核。

从安全角度来看，所示的策略是高风险区域。例如，允许除特定用户或组之外的任何人创建对象或写入权限的 S3 存储桶策略极其危险。因此，我们会验证政策，并根据内容批准或拒绝，这些政策无法自动创建。我们正在研究解决此问题的可能方法。

我们目前没有针对以下资源的自动验证。

```
[
    "S3::BucketPolicy",
    "SNS::TopicPolicy",
    "SQS::QueuePolicy"
]
```

## 参数验证
<a name="cfn-validator-examples-param"></a>

验证模板参数是否没有提供值；它必须具有默认值。

## 资源属性验证
<a name="cfn-validator-examples-resource-atts"></a>

必填属性检查：某些资源类型必须存在某些属性。
+ “VPCOptions” 必须存在于 `AWS::OpenSearch::Domain`
+ “CludsterSubnetGroupName” 必须存在于 `AWS::Redshift::Cluster`

```
{
    "AWS::OpenSearch::Domain": [
      "VPCOptions"
    ],
    "AWS::Redshift::Cluster": [
      "ClusterSubnetGroupName"
    ]
}
```

不允许的属性检查：某些资源类型的某些属性必须\$1不\$1存在。
+ “SecretString” 不能存在于 “AWS::SecretsManager::Secret”
+ “MongoDbSettings” 不能存在于 “AWS::DMS::Endpoint”

```
{
  "AWS::SecretsManager::Secret": [
    "SecretString"  
  ],  
  "AWS::DMS::Endpoint": [
    "MongoDbSettings"  
  ]
}
```

SSM 参数检查：对于以下列表中的属性，必须通过 Secrets Manager 或 Systems Manager 参数存储（安全字符串参数）指定值：

```
{
  "RDS::DBInstance": [
    "MasterUserPassword",   
    "TdeCredentialPassword"  
  ],  
  "RDS::DBCluster": [
    "MasterUserPassword"  
  ],  
  "ElastiCache::ReplicationGroup": [
    "AuthToken"  
  ],  
  "DMS::Certificate": [
    "CertificatePem",    
    "CertificateWallet" 
  ],  
  "DMS::Endpoint": [
    "Password"  
  ],
  "CodePipeline::Webhook": {
    "AuthenticationConfiguration": [
        "SecretToken"  
    ]
  },
  "DocDB::DBCluster": [
    "MasterUserPassword"
  ]
},
```

某些属性必须符合某些模式；例如，IAM 实例配置文件名称不得以 [AMS 保留前缀](https://docs.aws.amazon.com/managedservices/latest/userguide/ams-reserved-prefixes)开头，并且属性值必须与特定的正则表达式匹配，如下所示：

```
{
    "AWS::EC2::Instance": {
      "IamInstanceProfile": [
        "^(?!arn:aws:iam|ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+",
        "arn:aws:iam::(\\$\\{AWS::AccountId\\}|[0-9]+):instance-profile/(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+"
      ]
    },
    "AWS::AutoScaling::LaunchConfiguration": {
      "IamInstanceProfile": [
        "^(?!arn:aws:iam|ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+",
        "arn:aws:iam::(\\$\\{AWS::AccountId\\}|[0-9]+):instance-profile/(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+"
      ]
    },
    "AWS::EC2::LaunchTemplate": {
      "LaunchTemplateData.IamInstanceProfile.Name": [
        "^(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+"
      ],
      "LaunchTemplateData.IamInstanceProfile.Arn": [
        "arn:aws:iam::(\\$\\{AWS::AccountId\\}|[0-9]+):instance-profile\/(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+"
      ]
    }
}
```

## 资源验证
<a name="cfn-validator-examples-resources"></a>

只能在模板中指定列入许可名单的资源；这些资源在中进行了介绍。[支持的资源](cfn-ingest-supp-services.md)

EC2 由于修补限制，不能将堆栈和 Auto Scaling 组 (ASGs) 放在同一个堆栈中。

## 安全组入口规则验证
<a name="cfn-validator-examples-sg-ingress"></a>
+ 对于来自 CFN Ingest Create 或 Stack Update CT 更改类型的请求：
  + 如果 (`IpProtocol`是 tcp 或 6) AND（端口为 80 或 443），则该`CidrIP`值没有限制
  + 否则，`CidrIP`不能是 0.0.0.0/0
+ 对于来自服务目录（服务目录产品）的请求：
  + 除了 CFN Ingest Create 或 Stack Update CT 更改类型验证外，协议所在的端口`ip_protocols`只能通过以下方式访问：`management_ports``allowed_cidrs`

    ```
    {
          "ip_protocols": ["tcp", "6", "udp", "17"],
          "management_ports": [22, 23, 389, 636, 1494, 1604, 2222, 3389, 5900, 5901, 5985, 5986],
          "allowed_cidrs": ["10.0.0.0/8", "100.64.0.0/10", "172.16.0.0/12", "192.168.0.0/16"]
      }
    ```