

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

# 在工作流文档中使用动态变量
<a name="wfdoc-dynamic-vars"></a>

您可以在工作流文档中使用动态变量来表示映像创建过程中在运行时会发生变化的值。动态变量的字符串插值允许您在结构化内容（例如 JSON 字符串）中嵌入 JSONPath 表达式。当您需要将复杂负载中的运行时值传递给步进操作（如或）时，这特别有用。`ExecuteStateMachine` `WaitForAction`

要对动态变量使用字符串插值，请在字符串内容中将 JSONPath 表达式用双大括号`"{{...}}"`括起来。只有用双花括号括起来的 JSONPath 表达式才会被当作变量处理。任何未用双大括号括起的 JSONPath 表达式都被视为文字字符串内容。

**JSONPath 动态工作流程变量语法**

```
$.<document structure>.[<step name>.]<variable name>
```

动态变量值表示为具有唯一标识目标变量的结构节点的 JSONPath 选择器。根 ($) 之后的第一个节点是指工作流文档结构，例如 `stepOutputs`，如果是 Image Builder 系统变量，则为 `imageBuilder`。以下列表包含支持 JSONPath 的工作流文档结构节点。

**文档结构节点**
+ 参数 – 工作流参数
+ stepOutputs – 同一工作流文档中某个步骤的输出
+ workflowOutputs – 已运行的工作流文档的输出
+ imagebuilder – Image Builder 系统变量

`parameters` 和 `stepOutputs` 文档结构节点包括步骤名称的可选节点。这样有助于确保所有步骤中变量名称的唯一性。

中的最后一个节点 JSONPath 是目标变量的名称，例如`instanceId`。

每个步骤都可以使用这些 JSONPath 动态变量引用任何先前步骤操作的输出。这也称为*链接或引用*。要引用先前步骤操作的输出，可以使用以下动态变量。

```
$.stepOutputs.{{step-name}}.{{output-name}}
```

**重要**  
当输入参数引用动态变量时，必须将链接指示符 (`.$`) 附加到参数名称的末尾。

**示例 1：输入参数链接指示器**

以下示例显示了一个输入参数，该参数在运行时使用字符串插值来解析参数值中的动态变量。

```
  - name: ApplyTestComponents
    action: ExecuteComponents
    onFailure: Abort
    inputs:
      instanceId.$: "$.{{stepOutputs}}.{{LaunchTestInstance}}.{{instanceId}}"
```

**示例 2：动态变量中的字符串插值**

以下示例演示了动态变量如何在运行时使用字符串插值来确定值。

```
- name: ValidateImageConfiguration
  action: ExecuteStateMachine
  inputs:
    stateMachineArn: arn:aws:states:{{us-east-1}}:{{111122223333}}:stateMachine:ImageValidation
    input: |
      {
        "imageId": "{{ $.stepOutputs.CreateImageFromInstance.imageId }}",
        "region": "us-east-1",
        "buildDate": "{{ $.imagebuilder.dateTime }}",
        "instanceType": "{{ $.stepOutputs.LaunchStep.instanceType }}"
      }
```

在此示例中，用双大括号包裹的 JSONPath 表达式在运行时被解析：
+ `{{ $.stepOutputs.CreateImageFromInstance.imageId }}`-解析为步骤中的实际图片 ID CreateImageFromInstance 
+ `{{ $.imagebuilder.dateTime }}`-解析为当前构建时间戳。有关您可以使用[使用 Image Builder 系统变量](#wfdoc-ib-vars)的 Image Builder 系统变量的列表，请参阅。
+ `{{ $.stepOutputs.LaunchStep.instanceType }}`-解析为中使用的实例类型 LaunchStep

像这样的字面字符串`"region": "us-east-1"`保持不变。

**注意**  
字符串插值适用于工作流程文档中的任何字符串内容，包括使用 YAML pipe () 运算符的多行字符串。`|`大括号要求充当一种转义机制，可以清楚地区分JSONPath 变量和文字文本内容。

## 使用 Image Builder 系统变量
<a name="wfdoc-ib-vars"></a>

Image Builder 提供了以下可在工作流文档中使用的系统变量：


|  变量名称  |  说明  |  Type  |  示例值  | 
| --- | --- | --- | --- | 
| cloudWatchLog群组 | 输出 CloudWatch 日志的日志组的名称。<br />格式：`/aws/imagebuilder/{{<recipe-name>}}` | 字符串 | `/aws/imagebuilder/{{sampleImageRecipe}}` | 
| cloudWatchLog直播 | 输出 CloudWatch 日志的日志流的名称。 | 字符串 | {{1.0.0/1}} | 
| collectImageMetadata | 指示 Image Builder 是否收集实例元数据的设置。 | 布尔值 | `true` \| `false` | 
| collectImageScan调查结果 | 设置的当前值，该设置允许 Image Builder 收集映像扫描调查发现。 | 布尔值 | `true` \| `false` | 
| imageBuildNumber | 映像的构建版本号。 | 整数 | {{1}} | 
| imageId | 基础映像的 AMI ID。 | 字符串 | {{ami-1234567890abcdef1}} | 
| imageName | 映像名称。 | 字符串 | {{sampleImage}} | 
| imageType | 映像输出类型。 | 字符串 | `AMI` \| `Docker` | 
| imageVersionNumber | 映像版本号。 | 字符串 | {{1.0.0}} | 
| instanceProfileName | Image Builder 用于启动构建和测试实例的实例配置文件角色的名称。 | 字符串 | {{SampleImageBuilderInstanceProfileRole}} | 
| platform | 所构建映像的操作系统平台。 | 字符串 | `Linux` \| `Windows` \| `MacOS` | 
| s3Logs | 一个 JSON 对象，包含 Image Builder 写入的 S3 日志的配置。 | JSON 对象 | {'s3Logs': {'s3 BucketName ':{{sample-bucket}}', '3 ':KeyPrefix'}} {{ib-logs}} | 
| securityGroups | 适用于构建和测试实例的安全组 IDs 。 | 列表 [字符串] | {{[sg-1234567890abcdef1, sg-11112222333344445]}} | 
| sourceImageARN | 工作流用于构建和测试阶段的 Image Builder 映像资源的 Amazon 资源名称（ARN）。 | 字符串 | arn: aws: imagebuilder::: image//{{us-east-1}}{{111122223333}}{{sampleImage}}{{1.0.0/1}} | 
| subnetId | 要在其中启动构建和测试实例的子网 ID。 | 字符串 | {{subnet-1234567890abcdef1}} | 
| terminateInstanceOn失败 | 设置的当前值，可指示 Image Builder 在发生故障时终止实例或保留实例以进行故障排除。 | 布尔值 | `true` \| `false` | 
| workflowPhase | 为执行工作流而运行的当前阶段。 | 字符串 | `Build` \| `Test` | 
| workingDirectory | 工作目录的路径。 | 字符串 | `/tmp` | 