

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

# 使用 “直接更改” 模式创建堆栈
<a name="dcm-creating-stacks"></a>

为了让 AMS 管理堆栈`AWSManagedServicesCloudFormationAdminRole`，在 CloudFormation 使用中启动堆栈时有两个要求：
+ 模板必须包含`AmsStackTransform`。
+ 堆栈名称必须以前缀开头，`stack-`后跟一个 17 个字符的字母数字字符串。

**注意**  
要成功使用`AmsStackTransform`，您必须确认您的堆栈模板包含相应`CAPABILITY_AUTO_EXPAND`功能，以便 CloudFormation (CFN) 创建或更新堆栈。为此，您可以将`CAPABILITY_AUTO_EXPAND`作为创建堆栈请求的一部分传递。如果模板中包含此功能时未确认此功能，则 CFN 会拒绝该请求。`AmsStackTransform`如果您的模板中有转换，CFN 控制台可确保您通过此功能，但是当您通过 CFN 控制台与 CFN 进行交互时，可能会错过此功能。 APIs  
无论何时使用以下 CFN API 调用，都必须通过此功能：  
[CreateChangeSet](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateChangeSet.html)
[ CreateStack](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html#API_CreateStack_RequestParameters)
[UpdateStack](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html)

使用 DCM 创建或更新堆栈时，将在堆栈上执行 CFN Ingest 和堆栈更新的 CTs 相同验证和增强，有关更多信息，请参阅载[CloudFormation 入指南、最佳实践](https://docs.aws.amazon.com/managedservices/latest/appguide/cfn-author-templates.html)和限制。唯一的例外是，AMS 默认安全组 (SGs) 不会附加到 Auto Scaling 组中的任何独立 EC2 EC2 实例或 Auto Scaling 组 (ASGs) 中的实例。使用独立 EC2 实例或创建 CloudFormation 模板时 ASGs，可以附加默认实例 SGs。

**注意**  
现在可以使用创建和管理 IAM 角色`AWSManagedServicesCloudFormationAdminRole`。

AMS 默认 SGs 具有入口和出口规则，允许实例成功启动，并允许稍后由 AMS 操作和您通过 SSH 或 RDP 进行访问。如果您发现 AMS 的默认安全组过于宽松，则可以创建自己的安全组，并 SGs 使用更严格的规则将其附加到您的实例，前提是它仍然允许您和 AMS 操作人员在事件发生期间访问该实例。

AMS 的默认安全组如下：
+ SentinelDefaultSecurityGroupPrivateOnly: 可以通过此 SSM 参数在 CFN 模板中进行访问 `/ams/${VpcId}/SentinelDefaultSecurityGroupPrivateOnly`
+ SentinelDefaultSecurityGroupPrivateOnlyEgressAll: 可以通过此 SSM 参数在 CFN 模板中进行访问 `/ams/${VpcId}/SentinelDefaultSecurityGroupPrivateOnlyEgressAll`

## AMS 转型
<a name="dcm-cs-ams-transform"></a>

 在 CloudFormation 模板`Transform`中添加声明。这将添加一个 CloudFormation 宏，用于在启动时验证堆栈并将其注册到 AMS。

**JSON** 示

```
"Transform": {
    "Name": "AmsStackTransform",
    "Parameters": {
      "StackId": {"Ref" : "AWS::StackId"}
    }
  }
```

**YAML 示例**

```
Transform:
  Name: AmsStackTransform
  Parameters:
    StackId: !Ref 'AWS::StackId'
```

在更新现有堆栈的模板时，还要添加该`Transform`语句。

**JSON** 示

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description" : "Create an SNS Topic",
    "Transform": {
      "Name": "AmsStackTransform",
      "Parameters": {
        "StackId": {"Ref" : "AWS::StackId"}
     }
  },
  "Parameters": {
    "TopicName": {
      "Type": "String",
      "Default": "HelloWorldTopic"
    }
  },
  "Resources": {
    "SnsTopic": {
      "Type": "AWS::SNS::Topic",
      "Properties": {
        "TopicName": {"Ref": "TopicName"}
      }
    }
  }
}
```

**YAML 示例**

```
AWSTemplateFormatVersion: '2010-09-09'
Description: Create an SNS Topic
Transform:
  Name: AmsStackTransform
  Parameters:
    StackId: !Ref 'AWS::StackId'
Parameters:
  TopicName:
    Type: String
    Default: HelloWorldTopic
Resources:
  SnsTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: !Ref TopicName
```

## 堆栈名称
<a name="dcm-cs-stack-name"></a>

堆栈名称必须以前缀开头，`stack-`后跟一个 17 个字符的字母数字字符串。这是为了保持与在 AMS 堆栈上运行的其他 AMS 系统的兼容性 IDs。 

 以下是生成兼容堆栈的方法示例 IDs：

Bash：

```
echo "stack-$(env LC_CTYPE=C tr -dc 'a-z0-9' < /dev/urandom | head -c 17)"
```

Python：

```
import string
import random

'stack-' + ''.join(random.choices(string.ascii_lowercase + string.digits, k=17))
```

Powershell：

```
"stack-" + ( -join ((0x30..0x39) + ( 0x61..0x7A) | Get-Random -Count 17  | % {[char]$_}) )
```