

这是新的《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-init
<a name="cfn-init"></a>

在 CloudFormation 模板中，您可以在 Amazon EC2 资源的 `Metadata` 部分中使用 `AWS::CloudFormation::Init` 来定义初始化任务。有关更多信息，请参阅 [`AWS::CloudFormation::Init`](aws-resource-init.md)。

`cfn-init` 帮助程序脚本会读取来自 `AWS::CloudFormation::Init` 键的模板元数据并进行相应操作：
+ 提取和解析来自 CloudFormation 的元数据
+ 安装软件包
+ 将文件写入磁盘
+ 启用/禁用以及启动/停止服务

`cfn-init` 帮助程序脚本通常通过 Amazon EC2 实例或启动模板的用户数据运行。

如果您不熟悉如何使用帮助程序脚本，建议您先完成《AWS CloudFormation 用户指南》**中的[在 Amazon EC2 上部署应用程序](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/deploying.applications.html)教程。

**Topics**
+ [语法](#cfn-init-Syntax)
+ [选项](#cfn-init-options)
+ [示例](#cfn-init-examples)
+ [相关资源](#cfn-init-related-resources)

**注意**  
如果您使用 `cfn-init` 来更新现有文件，则它将在同一目录下为原始文件创建一个扩展名为 .bak 的备份副本。例如，如果更新 `/{{path}}/{{to}}/{{file_name}}`，则操作生成两个文件：`/{{path}}/{{to}}/{{file_name}}.bak` 包含原始文件的内容，而 `/{{path}}/{{to}}/{{file_name}}` 包含更新的内容。

## 语法
<a name="cfn-init-Syntax"></a>

```
cfn-init --stack|-s {{stack.name.or.id}} \
         --resource|-r {{logical.resource.id}} \
         --region {{region}} \
         --access-key {{access.key}} \
         --secret-key {{secret.key}} \
         --role {{rolename}} \
         --credential-file|-f {{credential.file}} \
         --configsets|-c {{config.sets}} \
         --url|-u {{service.url}} \
         --http-proxy {{HTTP.proxy}} \
         --https-proxy {{HTTPS.proxy}} \
         --verbose|-v
```

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

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


| 名称 | 描述 | 必填 | 
| --- | --- | --- | 
|  `-s, --stack`  | 堆栈名称或堆栈 ID。<br />*类型*：字符串<br />*默认值*：无<br />*示例*：`--stack { "Ref" : "AWS::StackName" },` | 是 | 
|  `-r, --resource `  | 包含元数据的资源的逻辑资源 ID。<br />*类型*：字符串<br />*示例*：`--resource WebServerHost` | 是 | 
|  `--region`  | 要使用的 CloudFormation 区域端点。<br />*类型*：字符串<br />*默认值*：`us-east-1`<br />*示例*：`--region ", { "Ref" : "AWS::Region" },` | 否 | 
|  `--access-key`  | 针对有权在 CloudFormation 上调用 `DescribeStackResource` 的账户的 AWS 访问密钥。凭证文件参数取代该参数。<br />*类型*：字符串 | 否 | 
|  `--secret-key`  | 对应于指定的 AWS 访问密钥的 AWS 秘密访问密钥。<br />*类型*：字符串 | 否 | 
|  `--role`  | 与实例关联的 IAM 角色的名称。<br />*类型*：字符串<br />条件：凭证文件参数替代该参数。 | 否 | 
|  `-f, --credential-file`  | 同时包含秘密访问密钥和访问密钥的文件。凭证文件参数取代 --role、--access-key 和 --secret-key 参数。<br />*类型*：字符串 | 否 | 
|  `-c, --configsets`  | 待运行逗号分隔 configsets 列表 (按顺序)。<br />*类型*：字符串<br />*默认值*：`default` | 否 | 
|  `-u, --url`  | 要使用的 CloudFormation 端点。<br />*类型*：字符串 | 否 | 
| `--http-proxy` | HTTP 代理 (非 SSL)。采用以下格式：`http://{{user:password}}@{{host}}:{{port}}`<br />*类型*：字符串 | 否 | 
| `--https-proxy` | HTTPS 代理。采用以下格式：`https://{{user:password}}@{{host}}:{{port}}`<br />*类型*：字符串 | 否 | 
| `-v, --verbose` | 详细的输出。这对于调试 `cfn-init` 无法初始化的用例非常有用。 您应该打开 `DisableRollback`，以便调试初始化操作。随后您可以将 SSH 置于控制台中，读取 `/var/log/cfn-init.log` 上的日志。有关更多信息，请参阅《AWS CloudFormation 用户指南》**中的[选择预置资源时如何处理故障](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stack-failure-options.html)。  | 否 | 
| `-h, --help` | 显示帮助消息并退出。 | 否 | 

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

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

以下示例显示 EC2 实例的 `UserData` 属性，该实例运行与 `WebServerInstance` 资源关联的 `InstallAndRun` 配置集。

要包含最新版本，请将 `yum install -y aws-cfn-bootstrap` 添加到 `UserData`。

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

`UserData` 属性使用 `Fn::Join` 内置函数。

```
{
    "UserData": {
        "Fn::Base64": {
            "Fn::Join": [
                "",
                [
                    "#!/bin/bash -xe\n",
                    "",
                    "yum install -y aws-cfn-bootstrap",
                    "/opt/aws/bin/cfn-init -v ",
                    "         --stack ",
                    {
                        "Ref": "AWS::StackName"
                    },
                    "         --resource WebServerInstance ",
                    "         --configsets InstallAndRun ",
                    "         --region ",
                    {
                        "Ref": "AWS::Region"
                    },
                    "\n"
                ]
            ]
        }
    }
}
```

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

`UserData` 属性使用 `Fn::Sub` 内部函数。

```
UserData:
  Fn::Base64: !Sub |
    #!/bin/bash -xe
    yum update -y aws-cfn-bootstrap
    # Install the files and packages from the metadata
    /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --configsets InstallAndRun --region ${AWS::Region}
```

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

如需查看带有示例模板的教程，请参阅《AWS CloudFormation 用户指南》**中的[在 Amazon EC2 上部署应用程序](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/deploying.applications.html)。

**如需查看 Windows 示例，请参阅《AWS CloudFormation 用户指南》中[引导基于 Windows 的 CloudFormation 堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-windows-stacks-bootstrapping.html)。

您也可以访问我们的 GitHub 存储库下载使用 `cfn-init` 的[示例模板](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) 

如需查看使用 `cfn-init` 的 LAMP 堆栈模板示例，请参阅 GitHub 网站上的 [ec2-lamp-server](https://github.com/aws-samples/ec2-lamp-server)。