

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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"
    ]
}
```

不允許的屬性檢查：某些資源類型必須 \*not\* 存在。
+ 「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)開頭，且屬性值必須符合特定 regex，如下所示：

```
{
    "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 擷取建立或堆疊更新 CT 變更類型的請求：
  + 如果 (`IpProtocol` 是 tcp 或 6) AND （連接埠是 80 或 443) ，則`CidrIP`值沒有限制
  + 否則， `CidrIP`不能是 0.0.0.0/0
+ 對於來自 Service Catalog (Service Catalog 產品） 的請求：
  + 除了 CFN 擷取建立或堆疊更新 CT 變更類型驗證之外， 中`management_ports`具有 中通訊協定的連接埠`ip_protocols`只能透過 存取`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"]
      }
    ```