

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

# 使用直接變更模式建立堆疊
<a name="dcm-creating-stacks"></a>

使用 在 CloudFormation 中啟動堆疊時，有兩個要求`AWSManagedServicesCloudFormationAdminRole`，以便 AMS 管理堆疊：
+ 範本必須包含 `AmsStackTransform`。
+ 堆疊名稱必須以字首開頭，`stack-`後面接著 17 個字元的英數字串。

**注意**  
若要成功使用 `AmsStackTransform`，您必須確認堆疊範本包含 `CAPABILITY_AUTO_EXPAND`功能，以便 CloudFormation (CFN) 建立或更新堆疊。您可以在 create-stack 請求中傳遞 `CAPABILITY_AUTO_EXPAND`來執行此操作。如果在範本中`AmsStackTransform`包含 時未確認此功能，CFN 會拒絕請求。如果您的範本中有轉換，CFN 主控台會確保您傳遞此功能，但當您透過其 APIs 與 CFN 互動時，可能會遺漏此功能。  
每當您使用下列 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 擷取和堆疊更新 CTs 的相同驗證和增強，如需詳細資訊[CloudFormation ，請參閱擷取指導方針、最佳實務和限制](https://docs.aws.amazon.com/managedservices/latest/appguide/cfn-author-templates.html)。例外情況是，AMS 預設安全群組 (SGs) 不會連接到 Auto Scaling 群組 (ASGs) 中的任何獨立 EC2 執行個體或 EC2 執行個體。當您使用獨立 EC2 執行個體或 ASGs 建立 CloudFormation 範本時，您可以連接預設 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>

 將`Transform`陳述式新增至 CloudFormation 範本。這會新增 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 堆疊 IDs 上操作之其他 AMS 系統的相容性。 

 以下是產生相容堆疊 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]$_}) )
```