

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

# 使用作业附件共享文件
<a name="build-job-attachments"></a>

使用*作业附件*使不在共享目录中的文件可用于您的作业，如果输出文件未写入共享目录，则可以捕获这些文件。Job 附件使用 Amazon S3 在主机之间传输文件。文件存储在 S3 存储桶中，如果文件内容未更改，则无需上传文件。

在[服务管理的队列](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/smf-manage.html)上运行作业时，必须使用作业附件，因为主机不共享文件系统位置。当作业的输入或输出文件存储在共享网络文件系统上时，例如当你的任务包中[包含 shell 或 Python 脚本时，作业](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/submit-job-bundle.html)附件对[客户管理的队](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/manage-cmf.html)列也很有用。

 当您使用 Deadline [Cloud CLI 或 Dead](https://pypi.org/project/deadline/) line Cloud 提交者提交任务捆绑包时，作业附件会使用作业的存储配置文件和队列所需的文件系统位置来识别不在工作主机上且应作为作业提交的一部分上传到 Amazon S3 的输入文件。这些存储配置文件还有助于 Deadline Cloud 识别工作服务器主机位置中的输出文件，这些文件必须上传到 Amazon S3 才能供您的工作站使用。

 作业附件示例使用和中的服务器场、队列、队列和存储配置文件配置[存储配置文件和路径映射](storage-profiles-and-path-mapping.md)。[示例项目基础架构](sample-project-infrastructure.md)在此之前，您应该仔细阅读这些部分。

在以下示例中，您使用示例作业捆绑包作为起点，然后对其进行修改以探索作业附件的功能。Job bundle 是您的工作使用作业附件的最佳方式。它们将目录中的 O [pen](https://github.com/OpenJobDescription/openjd-specifications/wiki) Job Description 作业模板与列出使用任务捆绑包的作业所需的文件和目录的其他文件组合在一起。有关任务捆绑包的更多信息，请参阅[Deadline Cloud 的打开职位描述 (OpenJD) 模板](build-job-bundle.md)。

# 使用作业提交文件
<a name="submitting-files-with-a-job"></a>

借助 Deadline Cloud，您可以启用作业工作流来访问工作主机的共享文件系统位置中不可用的输入文件。Job 附件允许渲染任务访问仅位于本地工作站驱动器或服务管理的队列环境中的文件。提交任务包时，可以包括作业所需的输入文件和目录的列表。Deadline Cloud 识别这些非共享文件，将其从本地计算机上传到 Amazon S3，然后将其下载到工作主机。它简化了将输入资源传输到渲染节点的过程，确保分布式作业执行所需的所有文件均可访问。

您可以直接在作业捆绑包中为作业指定文件，使用使用环境变量或脚本提供的作业模板中的参数，以及使用作业的`assets_references`文件。您可以使用其中一种方法或三种方法的组合。您可以为任务的捆绑包指定存储配置文件，使其仅上传本地工作站上已更改的文件。

本节使用中的示例任务捆绑包 GitHub 来演示 Deadline Cloud 如何识别任务中要上传的文件、这些文件在 Amazon S3 中的组织方式，以及如何将它们提供给处理您任务的工作主机。

**Topics**
+ [Deadline Cloud 如何将文件上传到亚马逊 S3](what-job-attachments-uploads-to-amazon-s3.md)
+ [Deadline Cloud 如何选择要上传的文件](how-job-attachments-decides-what-to-upload-to-amazon-s3.md)
+ [作业如何查找工作附件输入文件](how-jobs-find-job-attachments-input-files.md)

# Deadline Cloud 如何将文件上传到亚马逊 S3
<a name="what-job-attachments-uploads-to-amazon-s3"></a>

此示例显示 Deadline Cloud 如何将文件从您的工作站或工作主机上传到 Amazon S3，以便共享这些文件。它使用来自的示例任务包 GitHub 和 Deadline Cloud CLI 来提交作业。

 首先将 De [adline Cloud 示例 GitHub存储库](https://github.com/aws-deadline/deadline-cloud-samples)克隆到您的[AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)环境中，然后将`job_attachments_devguide`任务包复制到您的主目录中：

```
git clone https://github.com/aws-deadline/deadline-cloud-samples.git
cp -r deadline-cloud-samples/job_bundles/job_attachments_devguide ~/
```

 安装 De [adline Cloud CLI](https://pypi.org/project/deadline/) 以提交工作捆绑包：

```
pip install deadline --upgrade
```

 `job_attachments_devguide`任务包只有一个步骤，任务运行一个 bash shell 脚本，该脚本的文件系统位置作为作业参数传递。作业参数的定义是：

```
...
- name: ScriptFile
  type: PATH
  default: script.sh
  dataFlow: IN
  objectType: FILE
...
```

 该`dataFlow`属性的`IN`值告诉作业附件，该`ScriptFile`参数的值是作业的输入。该`default`属性的值是作业包目录的相对位置，但也可以是绝对路径。此参数定义将作业包目录中的`script.sh`文件声明为作业运行所需的输入文件。

 接下来，请确保 Deadline Cloud CLI 没有配置存储配置文件，然后将任务提交到队列`Q1`：

```
# Change the value of FARM_ID to your farm's identifier
FARM_ID=farm-00112233445566778899aabbccddeeff
# Change the value of QUEUE1_ID to queue Q1's identifier
QUEUE1_ID=queue-00112233445566778899aabbccddeeff

deadline config set settings.storage_profile_id ''

deadline bundle submit --farm-id $FARM_ID --queue-id $QUEUE1_ID job_attachments_devguide/
```

 运行此命令后 Deadline Cloud CLI 的输出如下所示：

```
Submitting to Queue: Q1
...
Hashing Attachments  [####################################]  100%
Hashing Summary:
    Processed 1 file totaling 39.0 B.
    Skipped re-processing 0 files totaling 0.0 B.
    Total processing time of 0.0327 seconds at 1.19 KB/s.

Uploading Attachments  [####################################]  100%
Upload Summary:
    Processed 1 file totaling 39.0 B.
    Skipped re-processing 0 files totaling 0.0 B.
    Total processing time of 0.25639 seconds at 152.0 B/s.

Waiting for Job to be created...
Submitted job bundle:
   job_attachments_devguide/
Job creation completed successfully
job-74148c13342e4514b63c7a7518657005
```

当您提交任务时，Deadline Cloud 会先对`script.sh`文件进行哈希处理，然后将其上传到 Amazon S3。

Deadline Cloud 将 S3 存储桶视为内容可寻址的存储。文件上传到 S3 对象。对象名称源自文件内容的哈希值。如果两个文件的内容相同，则无论文件位于何处或名称如何，它们都具有相同的哈希值。这种内容寻址存储使得 Deadline Cloud 能够避免上传已经可用的文件。

 您可以使用 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 来查看上传到 Amazon S3 的对象：

```
# The name of queue `Q1`'s job attachments S3 bucket
Q1_S3_BUCKET=$(
  aws deadline get-queue --farm-id $FARM_ID --queue-id $QUEUE1_ID \
    --query 'jobAttachmentSettings.s3BucketName' | tr -d '"'
)

aws s3 ls s3://$Q1_S3_BUCKET --recursive
```

 两个对象已上传到 S3：
+  `DeadlineCloud/Data/87cb19095dd5d78fcaf56384ef0e6241.xxh128`— 的内容`script.sh`。对象键`87cb19095dd5d78fcaf56384ef0e6241`中的值是文件内容的哈希值，扩展名`xxh128`表示哈希值是以 128 位 [xx](https://xxhash.com/) hash 计算得出的。
+  `DeadlineCloud/Manifests/<farm-id>/<queue-id>/Inputs/<guid>/a1d221c7fd97b08175b3872a37428e8c_input`— 作业提交的清单对象。`<farm-id>``<queue-id>`、和的值`<guid>`是您的服务器场标识符、队列标识符和随机十六进制值。此示例`a1d221c7fd97b08175b3872a37428e8c`中的值是根据字符串`/home/cloudshell-user/job_attachments_devguide`（所在`script.sh`目录）计算得出的哈希值。

 清单对象包含作为任务提交的一部分上传到 S3 的特定根路径上的输入文件的信息。下载此清单文件 (`aws s3 cp s3://$Q1_S3_BUCKET/<objectname>`)。其内容类似于：

```
{
    "hashAlg": "xxh128",
    "manifestVersion": "2023-03-03",
    "paths": [
        {
            "hash": "87cb19095dd5d78fcaf56384ef0e6241",
            "mtime": 1721147454416085,
            "path": "script.sh",
            "size": 39
        }
    ],
    "totalSize": 39
}
```

这表示文件`script.sh`已上传，该文件内容的哈希值为`87cb19095dd5d78fcaf56384ef0e6241`。此哈希值与对象名称中的值相匹配`DeadlineCloud/Data/87cb19095dd5d78fcaf56384ef0e6241.xxh128`。Deadline Cloud 使用它来知道要为该文件的内容下载哪个对象。

 此文件的完整架构[可在中找到 GitHub](https://github.com/aws-deadline/deadline-cloud/blob/mainline/src/deadline/job_attachments/asset_manifests/v2023_03_03/validate.py)。

使用该[CreateJob 操作](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateJob.html)时，您可以设置清单对象的位置。您可以使用该[GetJob操作](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetJob.html)来查看位置：

```
{
    "attachments": {
        "file system": "COPIED",
        "manifests": [
            {
                "inputManifestHash": "5b0db3d311805ea8de7787b64cbbe8b3",
                "inputManifestPath": "<farm-id>/<queue-id>/Inputs/<guid>/a1d221c7fd97b08175b3872a37428e8c_input",
                "rootPath": "/home/cloudshell-user/job_attachments_devguide",
                "rootPathFormat": "posix"
            }
        ]
    },
    ...
}
```

# Deadline Cloud 如何选择要上传的文件
<a name="how-job-attachments-decides-what-to-upload-to-amazon-s3"></a>

 任务附件考虑上传到 Amazon S3 作为任务输入的文件和目录是：
+  在作业捆绑包的作业模板中定义的所有 `PATH`-type 作业参数的值，其`dataFlow`值为`IN`或`INOUT`。
+  在作业捆绑包的资产引用文件中作为输入列出的文件和目录。

 如果您提交的工作没有存储配置文件，则会上传所有考虑上传的文件。如果您提交带有存储配置文件的任务，则如果文件位于存储配置文件的 `SHARED`-type 文件系统位置，而这些位置也是队列所需的文件系统位置，则不会将其上传到 Amazon S3。这些位置预计将在运行任务的工作服务器主机上可用，因此无需将其上传到 S3。

 在此示例中，您在 AWS CloudShell 环境`WSAll`中创建`SHARED`文件系统位置，然后将文件添加到这些文件系统位置。使用以下命令：

```
# Change the value of WSALL_ID to the identifier of the WSAll storage profile
WSALL_ID=sp-00112233445566778899aabbccddeeff

sudo mkdir -p /shared/common /shared/projects/project1 /shared/projects/project2
sudo chown -R cloudshell-user:cloudshell-user /shared

for d in /shared/common /shared/projects/project1 /shared/projects/project2; do
  echo "File contents for $d" > ${d}/file.txt
done
```

 接下来，将资产引用文件添加到作业捆绑包中，该文件包含您作为作业输入创建的所有文件。使用以下命令：

```
cat > ${HOME}/job_attachments_devguide/asset_references.yaml << EOF
assetReferences:
  inputs:
    filenames:
    - /shared/common/file.txt
    directories:
    - /shared/projects/project1
    - /shared/projects/project2
EOF
```

 接下来，将 Deadline Cloud CLI 配置为使用`WSAll`存储配置文件提交作业，然后提交任务捆绑包：

```
# Change the value of FARM_ID to your farm's identifier
FARM_ID=farm-00112233445566778899aabbccddeeff
# Change the value of QUEUE1_ID to queue Q1's identifier
QUEUE1_ID=queue-00112233445566778899aabbccddeeff
# Change the value of WSALL_ID to the identifier of the WSAll storage profile
WSALL_ID=sp-00112233445566778899aabbccddeeff

deadline config set settings.storage_profile_id $WSALL_ID

deadline bundle submit --farm-id $FARM_ID --queue-id $QUEUE1_ID job_attachments_devguide/
```

当您提交任务时，Deadline Cloud 会将两个文件上传到 Amazon S3。您可以从 S3 下载任务的清单对象以查看上传的文件：

```
for manifest in $( \
  aws deadline get-job --farm-id $FARM_ID --queue-id $QUEUE1_ID --job-id $JOB_ID \
    --query 'attachments.manifests[].inputManifestPath' \
    | jq -r '.[]'
); do
  echo "Manifest object: $manifest"
  aws s3 cp --quiet s3://$Q1_S3_BUCKET/DeadlineCloud/Manifests/$manifest /dev/stdout | jq .
done
```

 在此示例中，有一个包含以下内容的清单文件：

```
{
    "hashAlg": "xxh128",
    "manifestVersion": "2023-03-03",
    "paths": [
        {
            "hash": "87cb19095dd5d78fcaf56384ef0e6241",
            "mtime": 1721147454416085,
            "path": "home/cloudshell-user/job_attachments_devguide/script.sh",
            "size": 39
        },
        {
            "hash": "af5a605a3a4e86ce7be7ac5237b51b79",
            "mtime": 1721163773582362,
            "path": "shared/projects/project2/file.txt",
            "size": 44
        }
    ],
    "totalSize": 83
}
```

 使用清单的[GetJob 操作](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetJob.html)可以查看是否`rootPath`为 “/”。

```
aws deadline get-job --farm-id $FARM_ID --queue-id $QUEUE1_ID --job-id $JOB_ID --query 'attachments.manifests[*]'
```

 一组输入文件的根路径始终是这些文件中最长的公共子路径。如果您的作业是从中提交的，并且由于输入文件位于不同的驱动器上Windows而没有公共子路径，则您会在每个驱动器上看到一个单独的根路径。清单中的路径始终相对于清单的根路径，因此上传的输入文件为：
+  `/home/cloudshell-user/job_attachments_devguide/script.sh`— 作业包中的脚本文件。
+  `/shared/projects/project2/file.txt`— `WSAll` 存储配置`SHARED`文件中文件系统位置中**不**在队列所需文件系统位置列表中的文件`Q1`。

文件系统位置 `FSCommon` (`/shared/common/file.txt`) 和 `FS1` (`/shared/projects/project1/file.txt`) 中的文件不在列表中。这是因为这些文件系统位置位于`WSAll`存储配置文件`SHARED`中，并且都在队列中所需的文件系统位置列表中`Q1`。

您可以看到在操作中使用特定存储配置文件提交的[GetStorageProfileForQueue 作业](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetStorageProfileForQueue.html)所考虑`SHARED`的文件系统位置。要查询队列`WSAll`的存储配置文件，`Q1`请使用以下命令：

```
aws deadline get-storage-profile --farm-id $FARM_ID --storage-profile-id $WSALL_ID

aws deadline get-storage-profile-for-queue --farm-id $FARM_ID --queue-id $QUEUE1_ID --storage-profile-id $WSALL_ID
```

# 作业如何查找工作附件输入文件
<a name="how-jobs-find-job-attachments-input-files"></a>

 要使任务使用 Deadline Cloud 通过任务附件上传到 Amazon S3 的文件，您的任务需要这些文件可通过工作主机上的文件系统获得。当作业的[会话](https://github.com/OpenJobDescription/openjd-specifications/wiki/How-Jobs-Are-Run#sessions)在工作服务器主机上运行时，Deadline Cloud 会将作业的输入文件下载到工作服务器主机本地驱动器上的临时目录中，并将每个作业根路径的路径映射规则添加到其在本地驱动器上的文件系统位置。

 在此示例中，在 AWS CloudShell 选项卡中启动 Deadline Cloud 工作者代理。让之前提交的所有作业完成运行，然后从日志目录中删除作业日志：

```
rm -rf ~/devdemo-logs/queue-*
```

 以下脚本修改作业捆绑包以显示会话临时工作目录中的所有文件和路径映射规则文件的内容，然后使用修改后的捆绑包提交作业：

```
# Change the value of FARM_ID to your farm's identifier
FARM_ID=farm-00112233445566778899aabbccddeeff
# Change the value of QUEUE1_ID to queue Q1's identifier
QUEUE1_ID=queue-00112233445566778899aabbccddeeff
# Change the value of WSALL_ID to the identifier of the WSAll storage profile
WSALL_ID=sp-00112233445566778899aabbccddeeff

deadline config set settings.storage_profile_id $WSALL_ID

cat > ~/job_attachments_devguide/script.sh << EOF
#!/bin/bash

echo "Session working directory is: \$(pwd)"
echo
echo "Contents:"
find . -type f
echo
echo "Path mapping rules file: \$1"
jq . \$1
EOF

cat > ~/job_attachments_devguide/template.yaml << EOF
specificationVersion: jobtemplate-2023-09
name: "Job Attachments Explorer"
parameterDefinitions:
- name: ScriptFile
  type: PATH
  default: script.sh
  dataFlow: IN
  objectType: FILE
steps:
- name: Step
  script:
    actions:
      onRun:
        command: /bin/bash
        args:
        - "{{Param.ScriptFile}}"
        - "{{Session.PathMappingRulesFile}}"
EOF

deadline bundle submit --farm-id $FARM_ID --queue-id $QUEUE1_ID job_attachments_devguide/
```

 在工作程序在您的 AWS CloudShell 环境中运行作业后，您可以查看作业的运行日志：

```
cat demoenv-logs/queue-*/session*.log
```

日志显示，会话中发生的第一件事是将作业的两个输入文件下载到工作器上：

```
2024-07-17 01:26:37,824 INFO ==============================================
2024-07-17 01:26:37,825 INFO --------- Job Attachments Download for Job
2024-07-17 01:26:37,825 INFO ==============================================
2024-07-17 01:26:37,825 INFO Syncing inputs using Job Attachments
2024-07-17 01:26:38,116 INFO Downloaded 142.0 B / 186.0 B of 2 files (Transfer rate: 0.0 B/s)
2024-07-17 01:26:38,174 INFO Downloaded 186.0 B / 186.0 B of 2 files (Transfer rate: 733.0 B/s)
2024-07-17 01:26:38,176 INFO Summary Statistics for file downloads:
Processed 2 files totaling 186.0 B.
Skipped re-processing 0 files totaling 0.0 B.
Total processing time of 0.09752 seconds at 1.91 KB/s.
```

 接下来是作业`script.sh`运行的输出：
+  提交作业时上传的输入文件位于会话临时目录中名称以 “assetroot” 开头的目录下。
+  输入文件的路径已相对于 “assetroot” 目录重新定位，而不是相对于作业输入清单 () 的根路径。`"/"`
+  路径映射规则文件包含一个额外的规则，该规则会重新映射`"/"`到 “assetroot” 目录的绝对路径。

 例如：

```
2024-07-17 01:26:38,264 INFO Output:
2024-07-17 01:26:38,267 INFO Session working directory is: /sessions/session-5b33f
2024-07-17 01:26:38,267 INFO 
2024-07-17 01:26:38,267 INFO Contents:
2024-07-17 01:26:38,269 INFO ./tmp_xdhbsdo.sh
2024-07-17 01:26:38,269 INFO ./tmpdi00052b.json
2024-07-17 01:26:38,269 INFO ./assetroot-assetroot-3751a/shared/projects/project2/file.txt
2024-07-17 01:26:38,269 INFO ./assetroot-assetroot-3751a/home/cloudshell-user/job_attachments_devguide/script.sh
2024-07-17 01:26:38,269 INFO 
2024-07-17 01:26:38,270 INFO Path mapping rules file: /sessions/session-5b33f/tmpdi00052b.json
2024-07-17 01:26:38,282 INFO {
2024-07-17 01:26:38,282 INFO   "version": "pathmapping-1.0",
2024-07-17 01:26:38,282 INFO   "path_mapping_rules": [
2024-07-17 01:26:38,282 INFO     {
2024-07-17 01:26:38,282 INFO       "source_path_format": "POSIX",
2024-07-17 01:26:38,282 INFO       "source_path": "/shared/projects/project1",
2024-07-17 01:26:38,283 INFO       "destination_path": "/mnt/projects/project1"
2024-07-17 01:26:38,283 INFO     },
2024-07-17 01:26:38,283 INFO     {
2024-07-17 01:26:38,283 INFO       "source_path_format": "POSIX",
2024-07-17 01:26:38,283 INFO       "source_path": "/shared/common",
2024-07-17 01:26:38,283 INFO       "destination_path": "/mnt/common"
2024-07-17 01:26:38,283 INFO     },
2024-07-17 01:26:38,283 INFO     {
2024-07-17 01:26:38,283 INFO       "source_path_format": "POSIX",
2024-07-17 01:26:38,283 INFO       "source_path": "/",
2024-07-17 01:26:38,283 INFO       "destination_path": "/sessions/session-5b33f/assetroot-assetroot-3751a"
2024-07-17 01:26:38,283 INFO     }
2024-07-17 01:26:38,283 INFO   ]
2024-07-17 01:26:38,283 INFO }
```

**注意**  
 如果您提交的作业有多个具有不同根路径的清单，则每个根路径都有一个不同的 “assetroot” 命名目录。

 如果您需要引用某个输入文件、目录或文件系统位置的重定位文件系统位置，则可以处理作业中的路径映射规则文件并自己执行重新映射，也可以将`PATH`类型作业参数添加到作业包中的作业模板中，然后将需要重新映射的值作为该参数的值传递。例如，以下示例修改任务捆绑包使其具有以下作业参数之一，然后提交以文件系统位置`/shared/projects/project2`为其值的作业：

```
cat > ~/job_attachments_devguide/template.yaml << EOF
specificationVersion: jobtemplate-2023-09
name: "Job Attachments Explorer"
parameterDefinitions:
- name: LocationToRemap
  type: PATH
steps:
- name: Step
  script:
    actions:
      onRun:
        command: /bin/echo
        args:
        - "The location of {{RawParam.LocationToRemap}} in the session is {{Param.LocationToRemap}}"
EOF

deadline bundle submit --farm-id $FARM_ID --queue-id $QUEUE1_ID job_attachments_devguide/ \
  -p LocationToRemap=/shared/projects/project2
```

 此作业运行的日志文件包含其输出：

```
2024-07-17 01:40:35,283 INFO Output:
2024-07-17 01:40:35,284 INFO The location of /shared/projects/project2 in the session is /sessions/session-5b33f/assetroot-assetroot-3751a
```

# 从作业中获取输出文件
<a name="getting-output-files-from-a-job"></a>

此示例显示 Deadline Cloud 如何识别您的任务生成的输出文件，决定是否将这些文件上传到 Amazon S3，以及如何在工作站上获取这些输出文件。

 在本示例中，使用`job_attachments_devguide_output`任务捆绑包而不是`job_attachments_devguide`任务捆绑包。首先，从克隆的 Deadline Cloud 示例 GitHub存储库中复制 AWS CloudShell 环境中的捆绑包：

```
cp -r deadline-cloud-samples/job_bundles/job_attachments_devguide_output ~/
```

 此任务捆绑包和任务捆绑包之间的重要区别是在作业模板中添加了一个新的作业参数：`job_attachments_devguide`

```
...
parameterDefinitions:
...
- name: OutputDir
  type: PATH
  objectType: DIRECTORY
  dataFlow: OUT
  default: ./output_dir
  description: This directory contains the output for all steps.
...
```

 参数的`dataFlow`属性具有值`OUT`。Deadline Cloud 使用值为`OUT`或的`dataFlow`作业参数的值`INOUT`作为作业的输出。如果将作为值传递给这类任务参数的文件系统位置重新映射到运行该作业的工作程序上的本地文件系统位置，则 Deadline Cloud 将在该位置查找新文件并将这些文件作为任务输出上传到 Amazon S3。

 要了解其工作原理，请先在 AWS CloudShell 选项卡中启动 Deadline Cloud 工作器代理。让之前提交的所有作业完成运行。然后从日志目录中删除作业日志：

```
rm -rf ~/devdemo-logs/queue-*
```

 接下来，使用此工作捆绑包提交作业。在你 CloudShell运行的工作线程之后，查看日志：

```
# Change the value of FARM_ID to your farm's identifier
FARM_ID=farm-00112233445566778899aabbccddeeff
# Change the value of QUEUE1_ID to queue Q1's identifier
QUEUE1_ID=queue-00112233445566778899aabbccddeeff
# Change the value of WSALL_ID to the identifier of the WSAll storage profile
WSALL_ID=sp-00112233445566778899aabbccddeeff

deadline config set settings.storage_profile_id $WSALL_ID

deadline bundle submit --farm-id $FARM_ID --queue-id $QUEUE1_ID ./job_attachments_devguide_output
```

 日志显示检测到一个文件作为输出并上传到 Amazon S3：

```
2024-07-17 02:13:10,873 INFO ----------------------------------------------
2024-07-17 02:13:10,873 INFO Uploading output files to Job Attachments
2024-07-17 02:13:10,873 INFO ----------------------------------------------
2024-07-17 02:13:10,873 INFO Started syncing outputs using Job Attachments
2024-07-17 02:13:10,955 INFO Found 1 file totaling 117.0 B in output directory: /sessions/session-7efa/assetroot-assetroot-3751a/output_dir
2024-07-17 02:13:10,956 INFO Uploading output manifest to DeadlineCloud/Manifests/farm-0011/queue-2233/job-4455/step-6677/task-6677-0/2024-07-17T02:13:10.835545Z_sessionaction-8899-1/c6808439dfc59f86763aff5b07b9a76c_output
2024-07-17 02:13:10,988 INFO Uploading 1 output file to S3: s3BucketName/DeadlineCloud/Data
2024-07-17 02:13:11,011 INFO Uploaded 117.0 B / 117.0 B of 1 file (Transfer rate: 0.0 B/s)
2024-07-17 02:13:11,011 INFO Summary Statistics for file uploads:
Processed 1 file totaling 117.0 B.
Skipped re-processing 0 files totaling 0.0 B.
Total processing time of 0.02281 seconds at 5.13 KB/s.
```

 日志还显示，Deadline Cloud 在 Amazon S3 存储桶中创建了一个新的清单对象，该存储桶配置为供队列中的任务附件使用`Q1`。清单对象的名称源自生成输出的任务的场、队列、作业、步骤、任务、时间戳和`sessionaction`标识符。下载此清单文件，查看 Deadline Cloud 将此任务的输出文件放在哪里：

```
# The name of queue `Q1`'s job attachments S3 bucket
Q1_S3_BUCKET=$(
  aws deadline get-queue --farm-id $FARM_ID --queue-id $QUEUE1_ID \
    --query 'jobAttachmentSettings.s3BucketName' | tr -d '"'
)

# Fill this in with the object name from your log
OBJECT_KEY="DeadlineCloud/Manifests/..."

aws s3 cp --quiet s3://$Q1_S3_BUCKET/$OBJECT_KEY /dev/stdout | jq .
```

 清单如下所示：

```
{
  "hashAlg": "xxh128",
  "manifestVersion": "2023-03-03",
  "paths": [
    {
      "hash": "34178940e1ef9956db8ea7f7c97ed842",
      "mtime": 1721182390859777,
      "path": "output_dir/output.txt",
      "size": 117
    }
  ],
  "totalSize": 117
}
```

 这表明输出文件内容保存到 Amazon S3 的方法与保存任务输入文件的方式相同。与输入文件类似，输出文件存储在 S3 中，其对象名包含文件哈希值和前缀`DeadlineCloud/Data`。

```
$ aws s3 ls --recursive s3://$Q1_S3_BUCKET | grep 34178940e1ef9956db8ea7f7c97ed842
2024-07-17 02:13:11        117 DeadlineCloud/Data/34178940e1ef9956db8ea7f7c97ed842.xxh128
```

 你可以使用 Deadline Cloud 监控器或 Deadline Cloud CLI 将任务的输出下载到你的工作站：

```
deadline job download-output --farm-id $FARM_ID --queue-id $QUEUE1_ID --job-id $JOB_ID
```

 提交的`OutputDir`作业中作业参数的值为`./output_dir`，因此输出将下载到作业捆绑包目录`output_dir`中名为的目录中。如果您将绝对路径或不同的相对位置指定为的值`OutputDir`，则输出文件将改为下载到该位置。

```
$ deadline job download-output --farm-id $FARM_ID --queue-id $QUEUE1_ID --job-id $JOB_ID
Downloading output from Job 'Job Attachments Explorer: Output'

Summary of files to download:
    /home/cloudshell-user/job_attachments_devguide_output/output_dir/output.txt (1 file)

You are about to download files which may come from multiple root directories. Here are a list of the current root directories:
[0] /home/cloudshell-user/job_attachments_devguide_output
> Please enter the index of root directory to edit, y to proceed without changes, or n to cancel the download (0, y, n) [y]: 

Downloading Outputs  [####################################]  100%
Download Summary:
    Downloaded 1 files totaling 117.0 B.
    Total download time of 0.14189 seconds at 824.0 B/s.
    Download locations (total file counts):
        /home/cloudshell-user/job_attachments_devguide_output (1 file)
```

# 使用依赖步骤中某个步骤中的文件
<a name="using-files-output-from-a-step-in-a-dependent-step"></a>

此示例说明了作业中的一个步骤如何访问同一作业中它所依赖的步骤的输出。

 为了使一个步骤的输出可供另一个步骤使用，Deadline Cloud 向会话添加了其他操作，以便在会话中运行任务之前下载这些输出。你可以通过将这些步骤声明为需要使用输出的步骤的依赖关系来告诉它从哪些步骤下载输出。

在此示例中使用`job_attachments_devguide_output`任务捆绑包。首先，在您的 AWS CloudShell 环境中从克隆的 Deadline Cloud 示例 GitHub存储库中制作一份副本。对其进行修改以添加一个依赖步骤，该步骤仅在现有步骤之后运行并使用该步骤的输出：

```
cp -r deadline-cloud-samples/job_bundles/job_attachments_devguide_output ~/

cat >> job_attachments_devguide_output/template.yaml << EOF
- name: DependentStep
  dependencies:
  - dependsOn: Step
  script:
    actions:
      onRun:
        command: /bin/cat
        args:
        - "{{Param.OutputDir}}/output.txt"
EOF
```

 使用此修改后的作业捆绑包创建的作业作为两个单独的会话运行，一个用于步骤 “Step” 中的任务，另一个用于步骤 “DependentStep” 中的任务。

首先在 CloudShell 选项卡中启动 Deadline Cloud 工作器代理。让之前提交的所有作业完成运行，然后从日志目录中删除作业日志：

```
rm -rf ~/devdemo-logs/queue-*
```

 接下来，使用修改后的任务捆绑包提交`job_attachments_devguide_output`作业。等待它在您 CloudShell 环境中的工作器上完成运行。查看两个会话的日志：

```
# Change the value of FARM_ID to your farm's identifier
FARM_ID=farm-00112233445566778899aabbccddeeff
# Change the value of QUEUE1_ID to queue Q1's identifier
QUEUE1_ID=queue-00112233445566778899aabbccddeeff
# Change the value of WSALL_ID to the identifier of the WSAll storage profile
WSALL_ID=sp-00112233445566778899aabbccddeeff

deadline config set settings.storage_profile_id $WSALL_ID

deadline bundle submit --farm-id $FARM_ID --queue-id $QUEUE1_ID ./job_attachments_devguide_output

# Wait for the job to finish running, and then:

cat demoenv-logs/queue-*/session-*
```

 在名为的步骤中任务的会话日志中`DependentStep`，有两个单独的下载操作正在运行：

```
2024-07-17 02:52:05,666 INFO ==============================================
2024-07-17 02:52:05,666 INFO --------- Job Attachments Download for Job
2024-07-17 02:52:05,667 INFO ==============================================
2024-07-17 02:52:05,667 INFO Syncing inputs using Job Attachments
2024-07-17 02:52:05,928 INFO Downloaded 207.0 B / 207.0 B of 1 file (Transfer rate: 0.0 B/s)
2024-07-17 02:52:05,929 INFO Summary Statistics for file downloads:
Processed 1 file totaling 207.0 B.
Skipped re-processing 0 files totaling 0.0 B.
Total processing time of 0.03954 seconds at 5.23 KB/s.

2024-07-17 02:52:05,979 INFO 
2024-07-17 02:52:05,979 INFO ==============================================
2024-07-17 02:52:05,979 INFO --------- Job Attachments Download for Step
2024-07-17 02:52:05,979 INFO ==============================================
2024-07-17 02:52:05,980 INFO Syncing inputs using Job Attachments
2024-07-17 02:52:06,133 INFO Downloaded 117.0 B / 117.0 B of 1 file (Transfer rate: 0.0 B/s)
2024-07-17 02:52:06,134 INFO Summary Statistics for file downloads:
Processed 1 file totaling 117.0 B.
Skipped re-processing 0 files totaling 0.0 B.
Total processing time of 0.03227 seconds at 3.62 KB/s.
```

 第一个操作下载名为 “Step” 的步骤所使用的`script.sh`文件。第二个操作下载该步骤的输出。Deadline Cloud 使用该步骤生成的输出清单作为输入清单来确定要下载哪些文件。

 在同一篇日志的后面，你可以看到名为 DependentStep “” 的步骤的输出：

```
2024-07-17 02:52:06,213 INFO Output:
2024-07-17 02:52:06,216 INFO Script location: /sessions/session-5b33f/assetroot-assetroot-3751a/script.sh
```