

这是新的《CloudFormation 模板参考指南》**。请更新您的书签和链接。有关开始使用 CloudFormation 的帮助，请参阅《AWS CloudFormation 用户指南》[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)。

# cfn-signal
<a name="cfn-signal"></a>

`cfn-signal` 帮助程序脚本会向 CloudFormation 发送信号来指示是否已成功创建或更新 Amazon EC2 实例。如果您在实例上安装和配置软件应用程序，则可在这些软件应用程序准备就绪时向 CloudFormation 发送信号。

您可以将 `cfn-signal` 脚本与 [`CreationPolicy` 属性](aws-attribute-creationpolicy.md) 搭配使用，或是将 [`UpdatePolicy` 属性](aws-attribute-updatepolicy.md) 与 Amazon EC2 Auto Scaling 群组的 `WaitOnResourceSignals` 搭配使用。CloudFormation 使用这些策略创建或更新资源时，会暂停堆栈上的工作直至资源收到所需数量的信号或超出超时期限。CloudFormation 会将接收的每个有效信号发送到堆栈事件以便您跟踪每个信号。

**Topics**
+ [用于发送资源信号的语法 (推荐)](#w2aac32c29b9)
+ [用于等待条件句柄的语法](#cfn-signal-Syntaxwaitcondition)
+ [选项](#cfn-signal-options)
+ [示例](#cfn-signal-examples)
+ [相关资源](#cfn-signal-related-resources)

## 用于发送资源信号的语法 (推荐)
<a name="w2aac32c29b9"></a>

如果您想向 CloudFormation 资源发送信号，请使用以下语法。

```
cfn-signal --success|-s {{signal.to.send}} \
        --access-key {{access.key}} \
        --credential-file|-f {{credential.file}} \
        --exit-code|-e {{exit.code}} \
        --http-proxy {{HTTP.proxy}} \
        --https-proxy {{HTTPS.proxy}} \
        --id|-i {{unique.id}} \
        --region {{AWS.region}} \
        --resource {{resource.logical.ID}} \
        --role {{IAM.role.name}} \
        --secret-key {{secret.key}} \
        --stack {{stack.name.or.stack.ID}} \
        --url {{CloudFormation.endpoint}}
```

**注意**  
`cfn-signal` 不需要凭证，因此您不需要使用 `--access-key`、`--secret-key`、`--role` 或 `--credential-file` 选项。但是，如果不指定证书，则 CloudFormation 会检查堆栈成员并将调用范围限制为实例所属的堆栈。有关更多信息，请参阅 [帮助程序脚本的权限](cfn-helper-scripts-reference.md#cfn-helper-scripts-reference-permissions)。

## 用于等待条件句柄的语法
<a name="cfn-signal-Syntaxwaitcondition"></a>

如果您想向等待条件句柄发送信号，请使用以下语法。

```
cfn-signal --success|-s {{signal.to.send}} \
        --reason|-r {{resource.status.reason}} \
        --data|-d {{data}} \
        --id|-i {{unique.id}} \
        --exit-code|-e {{exit.code}} \
        {{waitconditionhandle.url}}
```

## 选项
<a name="cfn-signal-options"></a>

您可使用的选项取决于您是向创建策略还是等待条件句柄发送信号。适用于创建策略的一些选项可能不适用于等待条件句柄。


| 名称 | 描述 | 必填 | 
| --- | --- | --- | 
| `--access-key` (仅适用于向资源发送信号) | 针对有权调用 CloudFormation `SignalResource ` API 的账户的 AWS 访问密钥。凭证文件参数取代该参数。<br />*类型*：字符串 | 否 | 
| `-d, --data` (仅适用于等待条件句柄)  | 要通过 `waitConditionHandle` 发送回的数据。默认值待留空。<br />*类型*：字符串<br />*默认值*：空 | 否 | 
| `-e, --exit-code`  | 进程中出现错误代码，用于确定成功或失败。如果已经指定，则忽略 `--success` 选项。<br />*类型*：字符串<br />*示例*：`-e $?`（适用于 Linux）、`-e %ERRORLEVEL%`（适用于 Windows cmd.exe）和 `-e $lastexitcode`（适用于 Windows PowerShell）。 | 否 | 
| `-f, --credential-file` (仅适用于向资源发送信号) | 同时包含秘密访问密钥和访问密钥的文件。凭证文件参数取代 --role、--access-key 和 --secret-key 参数。<br />*类型*：字符串 | 否 | 
| `--http-proxy` | HTTP 代理 (非 SSL)。采用以下格式：`http://{{user:password}}@{{host}}:{{port}}`<br />*类型*：字符串 | 否 | 
| `--https-proxy` | HTTPS 代理。采用以下格式：`https://{{user:password}}@{{host}}:{{port}}`<br />*类型*：字符串 | 否 | 
| `-i, --id` | 要发送的唯一 ID。<br />*类型*：字符串<br />*默认*：Amazon EC2 实例的 ID。如果无法解析该 ID，则将返回计算机的完全限定域名（FQDN）。 | 否 | 
| `-r, --reason ` (仅适用于等待条件句柄)  | 如成功为错误信息，资源事件状态原因 (当前仅用于故障) 则将默认为“配置失败”。<br />*类型*：字符串 | 否 | 
| --region (仅适用于向资源发送信号) | 要使用的 CloudFormation 区域端点。<br />*类型*：字符串<br />*默认值*：`us-east-1` | 否 | 
| --resource (仅适用于向资源发送信号) | 包含要向其发送信号的创建策略的资源的逻辑 ID。<br />*类型*：字符串 | 是 | 
| `--role` (仅适用于向资源发送信号) | 与实例关联的 IAM 角色的名称。<br />*类型*：字符串<br />条件：凭证文件参数替代该参数。 | 否 | 
| `-s, --success`  | 如果为 true，则发出信号 `SUCCESS`，否则 `FAILURE`。<br />*类型*：布尔值<br />*默认值*：`true` | 否 | 
| `--secret-key` (仅适用于向资源发送信号) | 对应于指定的 AWS 访问密钥的 AWS 秘密访问密钥。<br />*类型*：字符串 | 否 | 
| `--stack` (仅适用于向资源发送信号) | 包含要向其发送信号的资源的堆栈名称或堆栈 ID。<br />*类型*：字符串 | 是 | 
| -u, --url (仅适用于向资源发送信号) | 要使用的 CloudFormation 端点。<br />*类型*：字符串 | 否 | 
| `waitconditionhandle.url` (仅适用于等待条件句柄)  | 可用于向关联的 `WaitCondition` 发送成功或失败信号的预签名 URL<br />*类型*：字符串 | 是 | 

## 示例
<a name="cfn-signal-examples"></a>

### Amazon Linux 示例
<a name="w2aac32c29c15b3"></a>

常规使用模式是同时使用 `cfn-init` 和 `cfn-signal`。`cfn-signal` 调用会利用对 `cfn-init` 调用的返回状态（使用 $? Shell 程序构造）。如果应用程序安装失败，则该实例将无法创建，并且堆栈将回滚。

#### JSON
<a name="cfn-signal-example.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Simple EC2 instance",
    "Resources": {
        "MyInstance": {
            "Type": "AWS::EC2::Instance",
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "config": {
                        "files": {
                            "/tmp/test.txt": {
                                "content": "Hello world!",
                                "mode": "000755",
                                "owner": "root",
                                "group": "root"
                            }
                        }
                    }
                }
            },
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
                "InstanceType": "t2.micro",
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "#!/bin/bash -x\n",
                                "# Install the files and packages from the metadata\n",
                                "yum install -y aws-cfn-bootstrap",
                                "\n",
                                "/opt/aws/bin/cfn-init -v ",
                                "         --stack ",
                                {
                                    "Ref": "AWS::StackName"
                                },
                                "         --resource MyInstance ",
                                "         --region ",
                                {
                                    "Ref": "AWS::Region"
                                },
                                "\n",
                                "# Signal the status from cfn-init\n",
                                "/opt/aws/bin/cfn-signal -e $? ",
                                "         --stack ",
                                {
                                    "Ref": "AWS::StackName"
                                },
                                "         --resource MyInstance ",
                                "         --region ",
                                {
                                    "Ref": "AWS::Region"
                                },
                                "\n"
                            ]
                        ]
                    }
                }
            },
            "CreationPolicy": {
                "ResourceSignal": {
                    "Timeout": "PT5M"
                }
            }
        }
    }
}
```

#### YAML
<a name="cfn-signal-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: Simple EC2 instance
Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Metadata:
      'AWS::CloudFormation::Init':
        config:
          files:
            /tmp/test.txt:
              content: Hello world!
              mode: '000755'
              owner: root
              group: root
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      InstanceType: t2.micro
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -x
          # Install the files and packages from the metadata
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource MyInstance --region ${AWS::Region}
          # Signal the status from cfn-init
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource MyInstance --region ${AWS::Region}
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M
```

## 相关资源
<a name="cfn-signal-related-resources"></a>

您也可以访问我们的 GitHub 存储库下载使用 `cfn-signal` 的[示例模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html#sample-templates)，包括以下模板。
+  [InstanceWithCfnInit.yaml](https://github.com/aws-cloudformation/aws-cloudformation-templates/blob/main/EC2/InstanceWithCfnInit.yaml) 
+  [AutoScalingRollingUpdates.yaml](https://github.com/aws-cloudformation/aws-cloudformation-templates/blob/main/AutoScaling/AutoScalingRollingUpdates.yaml) 