

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

# 建置任務以提交至截止日期雲端
<a name="building-jobs"></a>

您可以使用任務套件將任務提交至截止日期雲端。任務套件是檔案的集合，包括 [Open Job Description (OpenJD)](https://github.com/OpenJobDescription/openjd-specifications) 任務範本，以及轉譯任務所需的任何資產檔案。

 任務範本說明工作者如何處理和存取資產，並提供工作者執行的指令碼。任務套件可讓藝術家、技術主管和管道開發人員輕鬆從本機工作站或內部部署轉譯陣列將複雜的任務提交至 Deadline Cloud。任務套件特別適用於處理大規模視覺效果、動畫或其他需要可擴展隨需運算資源之媒體轉譯專案的團隊。

您可以使用本機檔案系統來儲存檔案，並使用文字編輯器來建立任務範本，進而建立任務套件。建立套件後，使用截止日期雲端 CLI 或截止日期雲端提交工具等工具，將任務提交至截止日期雲端

您可以將資產存放在工作者之間共用的檔案系統中，也可以使用截止日期雲端任務附件，自動將資產移至工作者可以存取它們的 S3 儲存貯體。任務連接也有助於將輸出從任務移回工作站。

 下列各節提供建立任務套件並將其提交至截止日期雲端的詳細說明。

**Topics**
+ [截止日期雲端的開啟任務描述 (OpenJD) 範本](build-job-bundle.md)
+ [在任務中使用檔案](using-files-in-your-jobs.md)
+ [使用任務附件來共用檔案](build-job-attachments.md)
+ [建立任務的資源限制](build-job-limits.md)
+ [如何將任務提交至截止日期雲端](submit-jobs-how.md)
+ [在截止日期雲端中排程任務](build-jobs-scheduling.md)
+ [在截止日期雲端中修改任務](build-jobs-modifying.md)

# 截止日期雲端的開啟任務描述 (OpenJD) 範本
<a name="build-job-bundle"></a>

*任務套件*是您用來定義 AWS 截止日期雲端任務的工具之一。它們將[開放任務描述 (OpenJD)](https://github.com/OpenJobDescription/openjd-specifications) 範本分組，其中包含其他資訊，例如任務與任務附件搭配使用的檔案和目錄。您可以使用截止日期雲端命令列界面 (CLI) 來使用任務套件提交任務，以便佇列執行。

任務套件是一種目錄結構，其中包含 OpenJD 任務範本、定義任務的其他檔案，以及做為任務輸入所需的任務特定檔案。您可以指定將任務定義為 YAML 或 JSON 檔案的檔案。

唯一的必要檔案是 `template.yaml`或 `template.json`。您也可以包含下列檔案：

```
/template.yaml (or template.json)
/asset_references.yaml (or asset_references.json)
/parameter_values.yaml (or parameter_values.json)
/other job-specific files and directories
```

使用任務套件搭配截止日期雲端 CLI 和任務附件進行自訂任務提交，或者您可以使用圖形提交界面。例如，以下是來自 GitHub 的 Blender 範例。若要在 [Blender 範例目錄中使用下列命令執行範例](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles)：

```
deadline bundle gui-submit blender_render
```

![\[Blender 的自訂任務提交界面範例。\]](http://docs.aws.amazon.com/zh_tw/deadline-cloud/latest/developerguide/images/blender_submit_shared_settings.png)


任務特定的設定面板是從任務範本中定義之任務參數的`userInterface`屬性產生。

若要使用命令列提交任務，您可以使用類似以下的命令

```
deadline bundle submit \
    --yes \
    --name Demo \
     -p BlenderSceneFile=location of scene file \
     -p OutputDir=file pathe for job output \
      blender_render/
```

或者，您可以在 `deadline` Python 套件中使用 `deadline.client.api.create_job_from_job_bundle`函數。

隨附於 Deadline Cloud 的所有任務提交者外掛程式，例如 Autodesk Maya 外掛程式，為您的提交產生任務套件，然後使用 Deadline Cloud Python 套件將您的任務提交至 Deadline Cloud。您可以在工作站的任務歷史記錄目錄中或使用提交者來查看提交的任務套件。您可以使用下列命令來尋找任務歷史記錄目錄：

```
deadline config get settings.job_history_dir
```

當您的任務在截止日期雲端工作者上執行時，它可以存取提供任務相關資訊的環境變數。環境變數為：


| 變數名稱 | Available | 
| --- | --- | 
| DEADLINE\$1FARM\$1ID | 所有動作 | 
| DEADLINE\$1FLEET\$1ID | 所有動作 | 
| DEADLINE\$1WORKER\$1ID | 所有動作 | 
| DEADLINE\$1QUEUE\$1ID | 所有動作 | 
| DEADLINE\$1JOB\$1ID | 所有動作 | 
| DEADLINE\$1STEP\$1ID | 任務動作 | 
| DEADLINE\$1SESSION\$1ID | 所有動作 | 
| DEADLINE\$1TASK\$1ID | 任務動作 | 
| DEADLINE\$1SESSIONACTION\$1ID | 所有動作 | 

**Topics**
+ [任務套件的任務範本元素](build-job-bundle-template.md)
+ [任務範本的任務區塊](build-job-bundle-chunking.md)
+ [任務套件的參數值元素](build-job-bundle-parameters.md)
+ [任務套件的資產參考元素](build-job-bundle-assets.md)

# 任務套件的任務範本元素
<a name="build-job-bundle-template"></a>

任務範本會定義執行時間環境，以及做為截止日期雲端任務一部分執行的程序。您可以在範本中建立參數，以便用來建立只在輸入值中不同的任務，就像程式設計語言中的函數一樣。

當您將任務提交至截止日期雲端時，該任務會在套用至佇列的任何佇列環境中執行。佇列環境是使用 Open Job Description (OpenJD) 外部環境規格建置。如需詳細資訊，請參閱 OpenJD GitHub 儲存庫中的[環境範本](https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#12-environment-template)。

如需使用 OpenJD 任務範本建立任務的簡介，請參閱在 OpenJD GitHub 儲存庫中[建立任務的簡介](https://github.com/OpenJobDescription/openjd-specifications/wiki/Introduction-to-Creating-a-Job)。如需其他資訊，請參閱[執行任務的方式](https://github.com/OpenJobDescription/openjd-specifications/wiki/How-Jobs-Are-Run)。OpenJD GitHub 儲存庫`samples`目錄中的 中有任務範本範例。

您可以 YAML 格式 (`template.yaml`) 或 JSON 格式 () 定義任務範本`template.json`。本節中的範例會以 YAML 格式顯示。

例如，`blender_render`範例的任務範本將輸入參數定義為`BlenderSceneFile`檔案路徑：

```
- name: BlenderSceneFile
  type: PATH
  objectType: FILE
  dataFlow: IN
  userInterface:
    control: CHOOSE_INPUT_FILE
    label: Blender Scene File
    groupLabel: Render Parameters
    fileFilters:
    - label: Blender Scene Files
      patterns: ["*.blend"]
    - label: All Files
      patterns: ["*"]
  description: >
    Choose the Blender scene file to render. Use the 'Job Attachments' tab
    to add textures and other files that the job needs.
```

`userInterface` 屬性會使用 命令在 Autodesk Maya 等應用程式的任務提交外掛程式中，定義`deadline bundle gui-submit`命令列自動產生之使用者介面的行為。

在此範例中，用於輸入 `BlenderSceneFile` 參數值的 UI 小工具是僅顯示`.blend`檔案的檔案選擇對話方塊。

![\[用於輸入 OpenJD 任務範本場景檔案參數的使用者介面小工具。\]](http://docs.aws.amazon.com/zh_tw/deadline-cloud/latest/developerguide/images/blender_submit_scene_file_widget.png)


如需使用 `userInteface`元素的更多範例，請參閱 GitHub 上 [deadline-cloud-samples](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline) 儲存庫中的 [gui\$1control\$1showcase](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/gui_control_showcase) 範例。

當您從任務套件提交任務時， `objectType`和 `dataFlow` 屬性會控制任務附件的行為。在此情況下， `objectType: FILE` 值`dataFlow:IN`表示 `BlenderSceneFile` 是任務附件的輸入檔案。

相反地， `OutputDir` 參數的定義具有 `objectType: DIRECTORY`和 `dataFlow: OUT`：

```
- name: OutputDir
  type: PATH
  objectType: DIRECTORY
  dataFlow: OUT
  userInterface:
    control: CHOOSE_DIRECTORY
    label: Output Directory
    groupLabel: Render Parameters
  default: "./output"
  description: Choose the render output directory.
```

任務附件會使用 `OutputDir` 參數的值做為任務寫入輸出檔案的目錄。

如需 `objectType`和 `dataFlow` 屬性的詳細資訊，請參閱 [Open Job Description 規格](https://github.com/OpenJobDescription/openjd-specifications)中的 [JobPathParameterDefinition](https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#22-jobpathparameterdefinition) 

`blender_render` 任務範本範例的其餘部分會將任務的工作流程定義為單一步驟，動畫中的每個影格都會轉譯為個別任務：

```
steps:
- name: RenderBlender
  parameterSpace:
    taskParameterDefinitions:
    - name: Frame
      type: INT
      range: "{{Param.Frames}}"
  script:
    actions:
      onRun:
        command: bash
        # Note: {{Task.File.Run}} is a variable that expands to the filename on the worker host's
        # disk where the contents of the 'Run' embedded file, below, is written.
        args: ['{{Task.File.Run}}']
    embeddedFiles:
      - name: Run
        type: TEXT
        data: |
          # Configure the task to fail if any individual command fails.
          set -xeuo pipefail

          mkdir -p '{{Param.OutputDir}}'

          blender --background '{{Param.BlenderSceneFile}}' \
                  --render-output '{{Param.OutputDir}}/{{Param.OutputPattern}}' \
                  --render-format {{Param.Format}} \
                  --use-extension 1 \
                  --render-frame {{Task.Param.Frame}}
```

例如，如果 `Frames` 參數的值為 `1-10`，則會定義 10 個任務。每個 都有不同的 `Frame` 參數值。若要執行任務：

1. 內嵌檔案 `data` 屬性中的所有變數參考都會展開，例如 `--render-frame 1`。

1. `data` 屬性的內容會寫入磁碟上工作階段工作目錄中的檔案。

1. 任務的`onRun`命令會解析為 `bash location of embedded file`，然後執行。

如需內嵌檔案、工作階段和路徑映射位置的詳細資訊，請參閱 [Open Job Description 規格](https://github.com/OpenJobDescription/openjd-specifications/wiki/How-Jobs-Are-Run)中的[任務執行方式](https://github.com/OpenJobDescription/openjd-specifications/wiki/How-Jobs-Are-Run)。

在 [deadline-cloud-samples/job\$1bundles](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles) 儲存庫中有更多任務範本的範例，以及 Open Job Descriptions 規格提供的[範本範例](https://github.com/OpenJobDescription/openjd-specifications/tree/mainline/samples)。

# 任務範本的任務區塊
<a name="build-job-bundle-chunking"></a>

任務區塊可讓您將多個任務分組為稱為區塊的單一工作單位。例如，在轉譯任務中，這表示截止日期雲端可以將多個影格一起分派，而不是每個命令叫用一個影格。這可降低每個任務啟動應用程式的負荷，並縮短總任務執行時間。如需詳細資訊，請參閱 OpenJD Wiki 中的[一次執行多個影格](https://github.com/OpenJobDescription/openjd-specifications/wiki/Job-Intro-03-Creating-a-Job-Template#42-running-multiple-frames-at-a-time)。

OpenJD 支援擴充功能，可將選用功能新增至任務範本。新增 `TASK_CHUNKING`延伸來啟用任務區塊。若要使用區塊，請將延伸模組新增至您的任務範本，並使用`CHUNK[INT]`任務參數類型。使用相同的`deadline bundle submit`命令提交區塊任務。例如，下列任務範本會以 10 的區塊轉譯影格：

```
specificationVersion: 'jobtemplate-2023-09'
extensions:
  - TASK_CHUNKING
name: Blender Render with Contiguous Chunking
parameterDefinitions:
  - name: BlenderSceneFile
    type: PATH
    objectType: FILE
    dataFlow: IN
  - name: Frames
    type: STRING
    default: "1-100"
  - name: OutputDir
    type: PATH
    objectType: DIRECTORY
    dataFlow: OUT
    default: "./output"
steps:
  - name: RenderBlender
    parameterSpace:
      taskParameterDefinitions:
        - name: Frame
          type: CHUNK[INT]
          range: "{{Param.Frames}}"
          chunks:
            defaultTaskCount: 10
            rangeConstraint: CONTIGUOUS
    script:
      actions:
        onRun:
          command: bash
          args: ["{{Task.File.Run}}"]
      embeddedFiles:
        - name: Run
          type: TEXT
          data: |
            set -xeuo pipefail
            
            mkdir -p '{{Param.OutputDir}}'
            
            # Parse the chunk range (e.g., "1-10") into start and end frames
            START_FRAME="$(echo '{{Task.Param.Frame}}' | cut -d- -f1)"
            END_FRAME="$(echo '{{Task.Param.Frame}}' | cut -d- -f2)"
            
            blender --background '{{Param.BlenderSceneFile}}' \
                    --render-output '{{Param.OutputDir}}/output_####' \
                    --render-format PNG \
                    --use-extension 1 \
                    -s "$START_FRAME" \
                    -e "$END_FRAME" \
                    --render-anim
```

在此範例中，Deadline Cloud 會將 100 個影格分成 `1-10`、 `11-20`等區塊。`{{Task.Param.Frame}}` 變數會展開至範圍表達式，例如 `1-10`。因為 `rangeConstraint` 設為 `CONTIGUOUS`，所以範圍一律為 `start-end` 格式。指令碼剖析此範圍，並使用 `-s`和 `-e`選項將開始和結束影格傳遞給 Blender`--render-anim`。

`chunks` 屬性支援下列欄位：
+ `defaultTaskCount` – （必要） 要合併為單一區塊的任務數量。最大值為 150。
+ `rangeConstraint` – （必要） 如果 `CONTIGUOUS`，區塊一律為連續範圍，例如 `1-10`。如果為 `NONCONTIGUOUS`，區塊可以是任意集，如 `1,3,7-10`。
+ `targetRuntimeSeconds` – （選用） 每個區塊的目標執行時間，以秒為單位。截止日期 雲端可以動態調整區塊大小，在某些區塊完成後接近此目標。

如需更多任務區塊範例，包括具有連續和非連續區塊的基本和 Blender 範例，請參閱 GitHub 上截止日期雲端範例儲存庫中的[任務區塊](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/task_chunking)範例。

**客戶受管機群需求**  
任務區塊需要相容的工作者代理程式版本。如果您使用客戶管理的機群，請確保在提交具有區塊的工作之前更新您的工作者代理程式。服務受管機群一律使用相容的工作者代理程式版本。

**下載區塊任務的輸出**  
當您下載區塊任務中單一任務的輸出時，Deadline Cloud 會下載整個區塊的輸出。例如，如果同時處理影格 1-10，則下載影格 3 的輸出會包含所有影格 1-10。此功能需要 0`deadline-cloud`.53.3 版或更新版本。

# 任務套件的參數值元素
<a name="build-job-bundle-parameters"></a>

您可以使用 參數檔案來設定任務範本中某些任務參數的值，或在任務套件中設定 [CreateJob](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateJob.html) 操作請求引數的值，以便在提交任務時不需要設定值。任務提交的 UI 可讓您修改這些值。

您可以 YAML 格式 (`parameter_values.yaml`) 或 JSON 格式 () 定義任務範本`parameter_values.json`。本節中的範例會以 YAML 格式顯示。

在 YAML 中，檔案格式為：

```
parameterValues:
- name: <string>
  value: <integer>, <float>, or <string>
- name: <string>
  value: <integer>, <float>, or <string>ab
... repeating as necessary
```

`parameterValues` 清單的每個元素都必須是下列其中一項：
+ 任務範本中定義的任務參數。
+ 在您提交任務之佇列的佇列環境中定義的任務參數。
+ 建立任務時傳遞至 `CreateJob`操作的特殊參數。
  + `deadline:priority` – 值必須是整數。它會做為[優先順序](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateJob.html#deadlinecloud-CreateJob-request-priority)參數傳遞給 `CreateJob`操作。
  + `deadline:targetTaskRunStatus` – 值必須是字串。它會做為 [targetTaskRunStatus](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateJob.html#deadlinecloud-CreateJob-request-targetTaskRunStatus) 參數傳遞至 `CreateJob`操作。
  + `deadline:maxFailedTasksCount` – 值必須是整數。它會做為 [maxFailedTasksCount](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateJob.html#deadlinecloud-CreateJob-request-maxFailedTasksCount) 參數傳遞至 `CreateJob`操作。
  + `deadline:maxRetriesPerTask` – 值必須是整數。它會做為 [maxRetriesPerTask](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateJob.html#deadlinecloud-CreateJob-request-maxRetriesPerTask) 參數傳遞至 `CreateJob`操作。
  + `deadline:maxWorkercount` – 值必須是整數。它會做為 [maxWorkerCount](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateJob.html#deadlinecloud-CreateJob-request-maxRetriesPerTask) 參數傳遞至 `CreateJob`操作。

任務範本一律是範本，而不是要執行的特定任務。參數值檔案可讓任務套件做為範本，如果某些參數沒有在此檔案中定義的值，則做為特定任務提交，如果所有參數都具有值，則做為特定任務提交。

例如， [blender\$1render 範例](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/blender_render)沒有參數檔案，其任務範本會定義沒有預設值的參數。此範本必須用作建立任務的範本。使用此任務套件建立任務後，Deadline Cloud 會將新的任務套件寫入任務歷史記錄目錄。

例如，當您使用下列命令提交任務時：

```
deadline bundle gui-submit blender_render/
```

新的任務套件包含的檔案`parameter_values.yaml`包含指定的參數：

```
% cat ~/.deadline/job_history/\(default\)/2024-06/2024-06-20-01-JobBundle-Demo/parameter_values.yaml
parameterValues:
- name: deadline:targetTaskRunStatus
  value: READY
- name: deadline:maxFailedTasksCount
  value: 10
- name: deadline:maxRetriesPerTask
  value: 5
- name: deadline:priority
  value: 75
- name: BlenderSceneFile
  value: /private/tmp/bundle_demo/bmw27_cpu.blend
- name: Frames
  value: 1-10
- name: OutputDir
  value: /private/tmp/bundle_demo/output
- name: OutputPattern
  value: output_####
- name: Format
  value: PNG
- name: CondaPackages
  value: blender
- name: RezPackages
  value: blender
```

您可以使用下列命令建立相同的任務：

```
deadline bundle submit ~/.deadline/job_history/\(default\)/2024-06/2024-06-20-01-JobBundle-Demo/
```

**注意**  
您提交的任務套件會儲存至您的任務歷史記錄目錄。您可以使用下列命令找到該目錄的位置：  

```
deadline config get settings.job_history_dir
```

# 任務套件的資產參考元素
<a name="build-job-bundle-assets"></a>

您可以使用 Deadline Cloud [任務附件](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/storage-job-attachments.html)，在工作站和 Deadline Cloud 之間來回傳輸檔案。資產參考檔案會列出輸入檔案和目錄，以及附件的輸出目錄。如果您未列出此檔案中的所有檔案和目錄，您可以在使用 `deadline bundle gui-submit`命令提交任務時選取它們。

如果您不使用任務附件，則此檔案沒有作用。

您可以 YAML 格式 (`asset_references.yaml`) 或 JSON 格式 () 定義任務範本`asset_references.json`。本節中的範例會以 YAML 格式顯示。

在 YAML 中，檔案格式為：

```
assetReferences:
    inputs:
        # Filenames on the submitting workstation whose file contents are needed as 
        # inputs to run the job.
        filenames:
        - list of file paths
        # Directories on the submitting workstation whose contents are needed as inputs
        # to run the job.
        directories:
        - list of directory paths

    outputs:
        # Directories on the submitting workstation where the job writes output files
        # if running locally.
        directories:
        - list of directory paths

    # Paths referenced by the job, but not necessarily input or output.
    # Use this if your job uses the name of a path in some way, but does not explicitly need
    # the contents of that path.
    referencedPaths:
    - list of directory paths
```

選取要上傳至 Amazon S3 的輸入或輸出檔案時，截止日期雲端會將檔案路徑與儲存設定檔中列出的路徑進行比較。儲存描述檔中的每個 `SHARED`類型檔案系統位置都會摘要掛載在工作站和工作者主機上的網路檔案共用。截止日期 雲端只會上傳不在其中一個檔案共享上的檔案。

如需建立和使用儲存設定檔的詳細資訊，請參閱[《 截止日期雲端使用者指南》中的在截止日期雲端中共用儲存](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/storage-shared.html)。 *AWS *

**Example - 截止日期雲端 GUI 建立的資產參考檔案**  
使用以下命令，使用 [blender\$1render 範例](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/blender_render)提交任務。  

```
deadline bundle gui-submit blender_render/
```
將一些額外的檔案新增至任務**附件索引標籤上的任務**：  

![\[截止日期雲端任務提交 GUI 的任務連接窗格。新增輸入檔案 /private/tmp/bundle_demo/a_texture.png 和輸入目錄 /private/tmp/bundle_demo/assets。\]](http://docs.aws.amazon.com/zh_tw/deadline-cloud/latest/developerguide/images/blender_submit_add_job_attachments.png)

提交任務後，您可以在任務歷史記錄目錄中查看任務套件中的 `asset_references.yaml` 檔案，以查看 YAML 檔案中的資產：  

```
% cat ~/.deadline/job_history/\(default\)/2024-06/2024-06-20-01-JobBundle-Demo/asset_references.yaml 
assetReferences:
  inputs:
    filenames:
    - /private/tmp/bundle_demo/a_texture.png
    directories:
    - /private/tmp/bundle_demo/assets
  outputs:
    directories: []
  referencedPaths: []
```

# 在任務中使用檔案
<a name="using-files-in-your-jobs"></a>

 您提交至 Deadline Cloud AWS 的許多任務都有輸入和輸出檔案。您的輸入檔案和輸出目錄可能位於共用檔案系統和本機磁碟機的組合上。任務需要在這些位置找到內容。Deadline Cloud 提供兩種功能：[任務附件](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/storage-job-attachments.html)和[儲存描述](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/storage-shared.html)檔，可共同協助您的任務找到所需的檔案。

任務附件提供數種優點
+ 使用 Amazon S3 在主機之間移動檔案
+ 將檔案從工作站傳輸到工作者主機，反之亦然
+ 適用於您啟用 功能的佇列中的任務
+ 主要與服務受管機群搭配使用，但也與客戶受管機群相容。

 使用儲存描述檔來映射工作站和工作者主機上共用檔案系統位置的配置。此映射可協助您的任務在工作站和工作者主機的位置不同時尋找共用檔案和目錄，例如使用 Windows型工作站和 Linux型工作者主機進行跨平台設定。任務附件也會使用儲存設定檔的檔案系統組態映射，來識別透過 Amazon S3 在主機之間來回傳輸所需的檔案。

 如果您不是使用任務附件，而且不需要在工作站和工作者主機之間重新對應檔案和目錄位置，則不需要使用儲存設定檔建立檔案共用的模型。

**Topics**
+ [範例專案基礎設施](sample-project-infrastructure.md)
+ [儲存設定檔和路徑映射](storage-profiles-and-path-mapping.md)

# 範例專案基礎設施
<a name="sample-project-infrastructure"></a>

若要示範如何使用任務附件和儲存描述檔，請使用兩個不同的專案來設定測試環境。您可以使用截止日期雲端主控台來建立測試資源。

1. 如果您尚未建立測試陣列，請建立測試陣列。若要建立陣列，請遵循[建立陣列](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/farms.html)中的程序。

1. 為兩個專案中的每個任務建立兩個佇列。若要建立佇列，請遵循[建立佇列](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/create-queue.html)中的程序。

   1. 建立第一個名為 的佇列**Q1**。使用下列組態，針對所有其他項目使用預設值。
      + 針對任務附件，選擇**建立新的 Amazon S3 儲存貯**體。
      + 選取**啟用與客戶受管機群的關聯**。
      + 對於以使用者身分執行的 ，請在 POSIX 使用者和群組**jobuser**中輸入 。
      + 針對佇列服務角色，建立名為 的新角色 **AssetDemoFarm-Q1-Role**
      + 清除預設 conda 佇列環境核取方塊。

   1. 建立第二個名為 的佇列**Q2**。使用下列組態，針對所有其他項目使用預設值。
      + 針對任務附件，選擇**建立新的 Amazon S3 儲存貯**體。
      + 選取**啟用與客戶受管機群的關聯**。
      + 對於以使用者身分執行的 ，請在 POSIX 使用者和群組**jobuser**中輸入 。
      + 針對佇列服務角色，建立名為 的新角色 **AssetDemoFarm-Q2-Role**
      + 清除預設 conda 佇列環境核取方塊。

1. 建立單一客戶受管機群，從兩個佇列執行任務。若要建立機群，請遵循[建立客戶受管機群](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/create-a-cmf.html)中的程序。使用下列組態：
   + 對於**名稱**，請使用 **DemoFleet**。
   + 對於**機群類型**，選擇**客戶受管**
   + 針對**機群服務角色**，建立名為 **AssetDemoFarm-Fleet-Role** 的新角色。
   + 請勿將機群與任何佇列建立關聯。

測試環境假設主機之間使用網路檔案共用共用三個檔案系統。在此範例中，位置具有下列名稱：
+ `FSCommon` - 包含兩個專案通用的輸入任務資產。
+ `FS1` - 包含專案 1 的輸入和輸出任務資產。
+ `FS2` - 包含專案 2 的輸入和輸出任務資產。

測試環境也會假設有三個工作站，如下所示：
+ `WSAll` - 開發人員用於所有專案的 Linux型工作站。共用檔案系統位置為：
  + `FSCommon`: `/shared/common`
  + `FS1`: `/shared/projects/project1`
  + `FS2`: `/shared/projects/project2`
+ `WS1` - 用於專案 1 Windows的 型工作站。共用檔案系統位置為：
  + `FSCommon`: `S:\`
  + `FS1`: `Z:\`
  + `FS2`：無法使用
+ `WS1` - 用於專案 2 的 macOS型工作站。共用檔案系統位置為：
  + `FSCommon`: `/Volumes/common`
  + `FS1`：無法使用
  + `FS2`: `/Volumes/projects/project2`

最後，定義機群中工作者的共用檔案系統位置。以下範例會將此組態稱為 `WorkerConfig`。共用位置為：
+ `FSCommon`: `/mnt/common`
+ `FS1`: `/mnt/projects/project1`
+ `FS2`: `/mnt/projects/project2`

 您不需要設定任何符合此組態的共用檔案系統、工作站或工作者。示範不需要有共用的位置。

# 儲存設定檔和路徑映射
<a name="storage-profiles-and-path-mapping"></a>

使用儲存描述檔來建立工作站和工作者主機上的檔案系統模型。每個儲存設定檔都會描述其中一個系統組態的作業系統和檔案系統配置。本主題說明如何使用儲存描述檔來建立主機的檔案系統組態模型，讓 Deadline Cloud 可以為您的任務產生路徑映射規則，以及如何從您的儲存描述檔產生這些路徑映射規則。

當您將任務提交至截止日期雲端時，您可以為任務提供選用的儲存設定檔 ID。此儲存設定檔說明提交工作站的檔案系統。它描述任務範本中檔案路徑使用的原始檔案系統組態。

您也可以將儲存描述檔與機群建立關聯。儲存設定檔說明機群中所有工作者主機的檔案系統組態。如果您有具有不同檔案系統組態的工作者，則必須將這些工作者指派給您陣列中的不同機群。

 路徑映射規則描述路徑應如何從任務中指定的路徑重新映射到工作者主機上路徑的實際位置。Deadline Cloud 會將任務儲存描述檔中所述的檔案系統組態與執行任務之機群的儲存描述檔進行比較，以衍生這些路徑映射規則。

**Topics**
+ [具有儲存設定檔的模型共用檔案系統位置](modeling-your-shared-filesystem-locations-with-storage-profiles.md)
+ [設定機群的儲存設定檔](configuring-storage-profiles-for-fleets.md)
+ [設定佇列的儲存設定檔](storage-profiles-for-queues.md)
+ [從儲存體設定檔衍生路徑映射規則](deriving-path-mapping-rules-from-storage-profiles.md)

# 具有儲存設定檔的模型共用檔案系統位置
<a name="modeling-your-shared-filesystem-locations-with-storage-profiles"></a>

 儲存設定檔會將其中一個主機組態的檔案系統組態建模。[範例專案基礎設施]()中有四種不同的主機組態。在此範例中，您會為每個 建立個別的儲存設定檔。您可以使用下列任一項來建立儲存設定檔：
+ [CreateStorageProfile API](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateStorageProfile.html)
+ [AWS::Deadline::StorageProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-deadline-storageprofile.html) CloudFormation 資源
+ [AWS 主控台](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/storage-shared.html#storage-profile)

 儲存設定檔是由檔案系統位置清單組成，每個檔案系統位置清單都會將與從主機提交或在主機上執行之任務相關的檔案系統位置和類型告知 Deadline Cloud。儲存描述檔應該只建立與任務相關的位置模型。例如，共用`FSCommon`位置位於 `WS1` 的工作站上`S:\`，因此對應的檔案系統位置為：

```
{
    "name": "FSCommon",
    "path": "S:\\",
    "type": "SHARED"
}
```

 使用下列命令，在 `WorkerConfig`[AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)中使用 建立工作站組態 `WS1`、 `WS2`和 的儲存設定檔，`WS3`以及工作者組態[AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)：

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

aws deadline create-storage-profile --farm-id $FARM_ID \
  --display-name WSAll \
  --os-family LINUX \
  --file-system-locations \
  '[
      {"name": "FSCommon", "type":"SHARED", "path":"/shared/common"},
      {"name": "FS1", "type":"SHARED", "path":"/shared/projects/project1"},
      {"name": "FS2", "type":"SHARED", "path":"/shared/projects/project2"}
  ]'

aws deadline create-storage-profile --farm-id $FARM_ID \
  --display-name WS1 \
  --os-family WINDOWS \
  --file-system-locations \
  '[
      {"name": "FSCommon", "type":"SHARED", "path":"S:\\"},
      {"name": "FS1", "type":"SHARED", "path":"Z:\\"}
   ]'

aws deadline create-storage-profile --farm-id $FARM_ID \
  --display-name WS2 \
  --os-family MACOS \
  --file-system-locations \
  '[
      {"name": "FSCommon", "type":"SHARED", "path":"/Volumes/common"},
      {"name": "FS2", "type":"SHARED", "path":"/Volumes/projects/project2"}
  ]'

aws deadline create-storage-profile --farm-id $FARM_ID \
  --display-name WorkerCfg \
  --os-family LINUX \
  --file-system-locations \
  '[
      {"name": "FSCommon", "type":"SHARED", "path":"/mnt/common"},
      {"name": "FS1", "type":"SHARED", "path":"/mnt/projects/project1"},
      {"name": "FS2", "type":"SHARED", "path":"/mnt/projects/project2"}
  ]'
```

**注意**  
您必須針對陣列中所有儲存設定檔的 `name` 屬性，使用相同的值來參考儲存設定檔中的檔案系統位置。Deadline Cloud 會比較名稱，以在產生路徑映射規則時，判斷來自不同儲存設定檔的檔案系統位置是否參照相同的位置。

# 設定機群的儲存設定檔
<a name="configuring-storage-profiles-for-fleets"></a>

您可以設定機群，以包含儲存設定檔，在機群中的所有工作者上建立檔案系統位置的模型。機群中所有工作者的主機檔案系統組態必須符合其機群的儲存設定檔。具有不同檔案系統組態的工作者必須位於不同的機群中。

若要設定機群的組態以使用 `WorkerConfig` 中的 儲存設定檔[AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)[AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)：

```
# Change the value of FARM_ID to your farm's identifier
FARM_ID=farm-00112233445566778899aabbccddeeff
# Change the value of FLEET_ID to your fleet's identifier
FLEET_ID=fleet-00112233445566778899aabbccddeeff
# Change the value of WORKER_CFG_ID to your storage profile named WorkerConfig
WORKER_CFG_ID=sp-00112233445566778899aabbccddeeff

FLEET_WORKER_MODE=$( \
  aws deadline get-fleet --farm-id $FARM_ID --fleet-id $FLEET_ID \
   --query '.configuration.customerManaged.mode' \
)
FLEET_WORKER_CAPABILITIES=$( \
  aws deadline get-fleet --farm-id $FARM_ID --fleet-id $FLEET_ID \
   --query '.configuration.customerManaged.workerCapabilities' \
)

aws deadline update-fleet --farm-id $FARM_ID --fleet-id $FLEET_ID \
  --configuration \
  "{
    \"customerManaged\": {
      \"storageProfileId\": \"$WORKER_CFG_ID\",
      \"mode\": $FLEET_WORKER_MODE,
      \"workerCapabilities\": $FLEET_WORKER_CAPABILITIES
    }
  }"
```

# 設定佇列的儲存設定檔
<a name="storage-profiles-for-queues"></a>

 佇列的組態包含提交至佇列之任務需要存取之共用檔案系統位置的區分大小寫名稱清單。例如，提交至佇列的任務`Q1`需要檔案系統位置`FSCommon`和 `FS1`。提交至佇列的任務`Q2`需要檔案系統位置 `FSCommon`和 `FS2`。

若要將佇列的組態設定為需要這些檔案系統位置，請使用下列指令碼：

```
# 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 QUEUE2_ID to queue Q2's identifier
QUEUE2_ID=queue-00112233445566778899aabbccddeeff

aws deadline update-queue --farm-id $FARM_ID --queue-id $QUEUE1_ID \
  --required-file-system-location-names-to-add FSComm FS1

aws deadline update-queue --farm-id $FARM_ID --queue-id $QUEUE2_ID \
  --required-file-system-location-names-to-add FSComm FS2
```

 佇列的組態也包含允許儲存設定檔的清單，這些設定檔適用於提交到 的任務，以及與該佇列相關聯的機群。只有定義佇列所有必要檔案系統位置的檔案系統位置的儲存設定檔，才允許在佇列的允許儲存設定檔清單中。

如果您提交的儲存描述檔不在佇列允許的儲存描述檔清單中，則任務會失敗。您可以隨時將沒有儲存設定檔的任務提交至佇列。標記為 `WSAll`和 的工作站組態`WS1`都有佇列 所需的檔案系統位置 (`FSCommon` 和 `FS1`)`Q1`。他們需要被允許將任務提交到佇列。同樣地，工作站會設定 `WSAll`並`WS2`符合佇列 的要求`Q2`。必須允許他們提交任務至該佇列。更新兩個佇列組態，以允許使用下列指令碼搭配這些儲存設定檔提交任務：

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

aws deadline update-queue --farm-id $FARM_ID --queue-id $QUEUE1_ID \
  --allowed-storage-profile-ids-to-add $WSALL_ID $WS1_ID

aws deadline update-queue --farm-id $FARM_ID --queue-id $QUEUE2_ID \
  --allowed-storage-profile-ids-to-add $WSALL_ID $WS2_ID
```

 如果您將`WS2`儲存描述檔新增至佇列允許的儲存描述檔清單`Q1`，則會失敗：

```
$ aws deadline update-queue --farm-id $FARM_ID --queue-id $QUEUE1_ID \
  --allowed-storage-profile-ids-to-add $WS2_ID

An error occurred (ValidationException) when calling the UpdateQueue operation: Storage profile id: sp-00112233445566778899aabbccddeeff does not have required file system location: FS1
```

 這是因為`WS2`儲存描述檔不包含`FS1`佇列`Q1`所需檔案系統位置的定義。

 將已設定的機群與不在佇列允許儲存設定檔清單中的儲存設定檔建立關聯也會失敗。例如：

```
$ aws deadline create-queue-fleet-association --farm-id $FARM_ID \
   --fleet-id $FLEET_ID \
   --queue-id $QUEUE1_ID

An error occurred (ValidationException) when calling the CreateQueueFleetAssociation operation: Mismatch between storage profile ids.
```

若要修正錯誤，請將名為 `WorkerConfig` 的儲存設定檔新增至佇列 `Q1`和佇列 的允許儲存設定檔清單`Q2`。然後，將機群與這些佇列建立關聯，以便機群中的工作者可以從兩個佇列執行任務。

```
# Change the value of FLEET_ID to your fleet's identifier
FLEET_ID=fleet-00112233445566778899aabbccddeeff
# Change the value of WORKER_CFG_ID to your storage profile named WorkerCfg
WORKER_CFG_ID=sp-00112233445566778899aabbccddeeff

aws deadline update-queue --farm-id $FARM_ID --queue-id $QUEUE1_ID \
  --allowed-storage-profile-ids-to-add $WORKER_CFG_ID

aws deadline update-queue --farm-id $FARM_ID --queue-id $QUEUE2_ID \
  --allowed-storage-profile-ids-to-add $WORKER_CFG_ID

aws deadline create-queue-fleet-association --farm-id $FARM_ID \
  --fleet-id $FLEET_ID \
  --queue-id $QUEUE1_ID

aws deadline create-queue-fleet-association --farm-id $FARM_ID \
  --fleet-id $FLEET_ID \
  --queue-id $QUEUE2_ID
```

# 從儲存體設定檔衍生路徑映射規則
<a name="deriving-path-mapping-rules-from-storage-profiles"></a>

 路徑映射規則描述路徑應如何從任務重新映射到工作者主機上路徑的實際位置。當任務在工作者上執行時，任務的儲存設定檔會與工作者機群的儲存設定檔進行比較，以衍生任務的路徑映射規則。

 截止日期 雲端會為佇列組態中的每個必要檔案系統位置建立映射規則。例如，使用`WSAll`儲存描述檔提交到佇列的任務`Q1`具有路徑映射規則：
+  `FSComm`: `/shared/common -> /mnt/common` 
+  `FS1`: `/shared/projects/project1 -> /mnt/projects/project1` 

 Deadline Cloud 會建立 `FSComm`和 `FS1` 檔案系統位置的規則，但即使 `WSAll`和 `WorkerConfig`儲存設定檔都定義 ，也無法建立`FS2`檔案系統位置`FS2`。這是因為佇列 `Q1`的必要檔案系統位置清單為 `["FSComm", "FS1"]`。

 您可以提交列印 [Open Job Description 路徑映射規則檔案的任務，然後在任務完成後讀取工作階段日誌，以確認使用特定儲存設定檔提交的任務可用的路徑映射規則](https://github.com/OpenJobDescription/openjd-specifications/wiki/How-Jobs-Are-Run#path-mapping)：

```
# 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

aws deadline create-job --farm-id $FARM_ID --queue-id $QUEUE1_ID \
  --priority 50 \
  --storage-profile-id $WSALL_ID \
  --template-type JSON --template \
  '{
    "specificationVersion": "jobtemplate-2023-09",
    "name": "DemoPathMapping",
    "steps": [
      {
        "name": "ShowPathMappingRules",
        "script": {
          "actions": {
            "onRun": {
              "command": "/bin/cat",
              "args": [ "{{Session.PathMappingRulesFile}}" ]
            }
          }
        }
      }
    ]
  }'
```

 如果您使用[截止日期雲端 CLI](https://pypi.org/project/deadline/) 提交任務，其`settings.storage_profile_id`組態設定會設定使用 CLI 提交的任務將擁有的儲存設定檔。若要使用`WSAll`儲存描述檔提交任務，請設定：

```
deadline config set settings.storage_profile_id $WSALL_ID
```

 若要像在範例基礎設施中執行一樣執行客戶受管工作者，請遵循*在截止日期雲端使用者指南*中[執行工作者代理](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/run-worker.html)程式中的程序來執行工作者 AWS CloudShell。如果您之前遵循這些指示，請先刪除 `~/demoenv-logs`和 `~/demoenv-persist`目錄。此外，設定方向參考的 `DEV_FARM_ID`和 `DEV_CMF_ID`環境變數值，如下所示，然後再執行此操作：

```
DEV_FARM_ID=$FARM_ID
DEV_CMF_ID=$FLEET_ID
```

 任務執行後，您可以在任務的日誌檔案中看到路徑映射規則：

```
cat demoenv-logs/${QUEUE1_ID}/*.log
...
JJSON log results (see below)
...
```

日誌包含 `FS1`和 `FSComm` 檔案系統的映射。重新格式化可讀性，日誌項目如下所示：

```
{
    "version": "pathmapping-1.0",
    "path_mapping_rules": [
        {
            "source_path_format": "POSIX",
            "source_path": "/shared/projects/project1",
            "destination_path": "/mnt/projects/project1"
        },
        {
            "source_path_format": "POSIX",
            "source_path": "/shared/common",
            "destination_path": "/mnt/common"
        }
    ]
```

 您可以提交具有不同儲存設定檔的任務，以查看路徑映射規則如何變更。

# 使用任務附件來共用檔案
<a name="build-job-attachments"></a>

使用*任務附件*讓不在共用目錄中的檔案可供您的任務使用，如果輸出檔案未寫入共用目錄，則擷取輸出檔案。任務連接使用 Amazon S3 在主機之間傳輸檔案。檔案存放在 S3 儲存貯體中，如果檔案的內容未變更，則不需要上傳檔案。

在[服務受管機群](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/smf-manage.html)上執行任務時，您必須使用任務附件，因為主機不會共用檔案系統位置。當任務的輸入或輸出檔案存放在共用網路檔案系統上時，例如當您的任務[套件](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/submit-job-bundle.html)包含 shell 或 Python 指令碼時，任務附件也適用於[客戶受管機群](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/manage-cmf.html)。

 當您使用[截止日期雲端 CLI](https://pypi.org/project/deadline/) 或截止日期雲端提交者提交任務套件時，任務連接會使用任務的儲存描述檔和佇列的必要檔案系統位置來識別不在工作者主機上的輸入檔案，並且應該上傳到 Amazon S3 作為任務提交的一部分。這些儲存設定檔也有助於 Deadline Cloud 識別工作者主機位置中的輸出檔案，這些檔案必須上傳至 Amazon S3，以便可供您的工作站使用。

 任務附件範例使用來自 和 的陣列、機群、佇列[範例專案基礎設施](sample-project-infrastructure.md)和儲存設定檔組態[儲存設定檔和路徑映射](storage-profiles-and-path-mapping.md)。您應該在此之前完成這些區段。

在下列範例中，您會使用範例任務套件做為起點，然後將其修改以探索任務連接的功能。任務套件是任務使用任務附件的最佳方式。它們將目錄中的[開啟任務描述](https://github.com/OpenJobDescription/openjd-specifications/wiki)任務範本與使用任務套件列出任務所需檔案和目錄的其他檔案結合在一起。如需任務套件的詳細資訊，請參閱 [截止日期雲端的開啟任務描述 (OpenJD) 範本](build-job-bundle.md)。

# 使用任務提交檔案
<a name="submitting-files-with-a-job"></a>

使用截止日期雲端，您可以讓任務工作流程存取工作者主機上共用檔案系統位置中無法使用的輸入檔案。任務附件允許轉譯任務僅存取位於本機工作站磁碟機或服務受管機群環境的檔案。提交任務套件時，您可以包含任務所需的輸入檔案和目錄清單。截止日期 雲端會識別這些非共用檔案，從本機電腦上傳到 Amazon S3，並將它們下載到工作者主機。它簡化了將輸入資產傳輸到轉譯節點的程序，確保可存取所有必要檔案以進行分散式任務執行。

您可以直接在任務套件中指定任務的檔案、在您使用環境變數或指令碼提供的任務範本中使用參數，以及使用任務`assets_references`的檔案。您可以使用其中一種方法或這三種方法的組合。您可以為任務的套件指定儲存描述檔，以便只上傳已在本機工作站上變更的檔案。

本節使用來自 GitHub 的範例任務套件，示範 Deadline Cloud 如何識別任務中要上傳的檔案、這些檔案如何在 Amazon S3 中組織，以及如何提供給處理任務的工作者主機。

**Topics**
+ [Deadline Cloud 如何將檔案上傳至 Amazon 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 如何將檔案上傳至 Amazon S3
<a name="what-job-attachments-uploads-to-amazon-s3"></a>

此範例顯示 Deadline Cloud 如何將檔案從工作站或工作者主機上傳至 Amazon S3，以便共用這些檔案。它使用來自 GitHub 和截止日期雲端 CLI 的範例任務套件來提交任務。

 首先將[截止期限雲端範例 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 ~/
```

 安裝[截止日期雲端 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`的檔案宣告為執行任務所需的輸入檔案。

 接下來，請確定截止日期雲端 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/
```

 在此命令執行後，來自截止日期雲端 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
```

當您提交任務時，截止日期雲端會先雜湊`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 位元 [xxhash](https://xxhash.com/)。
+  `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`類型任務參數的值，`dataFlow`其值為 `IN`或 `INOUT`。
+  列為任務套件資產參考檔案中輸入的檔案和目錄。

 如果您提交的任務沒有儲存描述檔，則會上傳所有考慮上傳的檔案。如果您使用儲存描述檔提交任務，如果檔案位於儲存描述檔的 `SHARED`類型檔案系統位置，而這些位置也是佇列所需的檔案系統位置，則檔案不會上傳到 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
```

 接著，設定截止日期雲端 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/
```

當您提交任務時，截止日期 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 `SHARED` 操作，查看使用特定儲存設定檔提交之任務所考慮的檔案系統位置。 [GetStorageProfileForQueue ](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetStorageProfileForQueue.html) 若要查詢佇列`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 索引標籤中啟動截止日期雲端工作者代理程式。讓任何先前提交的任務完成執行，然後從日誌目錄中刪除任務日誌：

```
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`任務套件。首先，從您複製的截止日期雲端範例 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 索引標籤中啟動截止日期雲端工作者代理程式。讓任何先前提交的任務完成執行。然後從日誌目錄中刪除任務日誌：

```
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`識別符。下載此資訊清單檔案，以查看截止日期雲端放置此任務輸出檔案的位置：

```
# 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
```

 您可以使用截止日期雲端監視器或截止日期雲端 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`的任務套件。首先，從您複製的截止日期雲端範例 GitHub 儲存庫，在您的 AWS CloudShell 環境中建立複本。修改它以新增相依步驟，該步驟只會在現有步驟之後執行，並使用該步驟的輸出：

```
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
```

 使用此修改後的任務套件建立的任務會以兩個單獨的工作階段執行，一個用於步驟「步驟」中的任務，另一個用於步驟「DependentStep」中的任務。

首先在 CloudShell 索引標籤中啟動截止日期雲端工作者代理程式。讓任何先前提交的任務完成執行，然後從日誌目錄中刪除任務日誌：

```
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.
```

 第一個動作會下載名為「步驟」的步驟所使用的`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
```

# 建立任務的資源限制
<a name="build-job-limits"></a>

提交至 Deadline Cloud 的任務可能取決於多個任務之間共用的資源。例如，相較於浮動特定資源的授權，一個陣列可能有更多工作者。或者，共用檔案伺服器可能只能同時將資料提供給有限數量的工作者。在某些情況下，一或多個任務可以宣告所有這些資源，導致新工作者啟動時資源無法使用而造成錯誤。

為了協助解決此問題，您可以針對這些受限的資源使用*限制*。截止日期 雲端會考慮限制資源的可用性，並使用該資訊來確保資源在新工作者啟動時可用，以便任務因資源無法使用而失敗的可能性較低。

系統會為整個陣列建立限制。提交至佇列的任務只能取得與佇列相關聯的限制。如果您為未與佇列相關聯的任務指定限制，則該任務不相容且無法執行。

若要使用限制，您可以 
+ [建立限制](job-limit-create.md)
+ [關聯限制和佇列](job-limit-associate.md)
+ [提交需要限制的任務](job-limit-job.md)

**注意**  
如果您執行的任務在佇列中具有與限制無關的資源限制，則該任務可能會耗用所有資源。如果您有受限的資源，請確定佇列中使用該資源的任務中的所有步驟都與限制相關聯。

對於陣列中定義的限制、與佇列相關聯，以及在任務中指定的限制，可能會發生以下四種情況之一：
+ 如果您建立限制、將其與佇列建立關聯，並在任務的範本中指定限制，任務會執行並僅使用限制中定義的資源。
+ 如果您建立限制，請在任務範本中指定限制，但不要將限制與佇列建立關聯，任務會標記為不相容，且不會執行。
+ 如果您建立限制，請勿將其與佇列建立關聯，也不要在任務的範本中指定限制，任務會執行，但不會使用限制。
+ 如果您完全不使用限制，任務會執行。

如果您將限制與多個佇列建立關聯，佇列會共用限制限制的資源。例如，如果您建立限制為 100，且一個佇列使用 60 個資源，則其他佇列只能使用 40 個資源。釋出資源時，任務可以從任何佇列取得該資源。

Deadline Cloud 提供兩個AWS CloudFormation指標，協助您監控限制提供的資源。您可以監控目前使用中的資源數量，以及限制中可用的資源數量上限。如需詳細資訊，請參閱*《截止日期雲端開發人員指南*》中的[資源限制指標](https://docs.aws.amazon.com/deadline-cloud/latest/developerguide/cloudwatch-metrics.html#cloudwatch-metrics-limits)。

您可以將限制套用至任務範本中的任務步驟。當您在`hostRequirements`步驟的 `amounts`區段中指定限制的數量需求名稱，且具有相同限制與任務的佇列`amountRequirementName`相關聯時，為此步驟排程的任務會受到資源限制的限制。

如果步驟需要受限於達到限制的資源，則該步驟中的任務將不會由其他工作者取得。

您可以將多個限制套用至任務步驟。例如，如果步驟使用兩個不同的軟體授權，您可以為每個授權套用個別的限制。如果步驟需要兩個限制，並達到其中一個資源的限制，則在資源可用之前，該步驟中的任務將不會被其他工作者挑選。

## 停止和刪除限制
<a name="job-limit-stop-delete"></a>

當您停止或刪除佇列與限制之間的關聯時，使用限制的任務會從需要此限制的步驟停止排程任務，並封鎖為步驟建立新工作階段。

處於就緒狀態的任務會保持就緒狀態，且任務會自動繼續與佇列和限制之間的關聯，再次變為作用中。您不需要重新排入任何任務的佇列。

當您停止或刪除佇列與限制之間的關聯時，有兩種選擇可讓您停止執行中的任務：
+ 停止和取消任務 – 具有取得限制之工作階段的工作者會取消所有任務。
+ 停止並完成執行中的任務 – 具有取得限制之工作階段的工作者完成其任務。

當您使用主控台刪除限制時，工作者會先停止執行任務，或在任務完成時最終停止執行任務。刪除關聯時，會發生下列情況：
+ 需要限制的步驟標示為不相容。
+ 包含這些步驟的整個任務都會取消，包括不需要限制的步驟。
+ 任務標示為不相容。

如果與限制相關聯的佇列具有與限制數量需求名稱相符的機群功能相關聯的機群，則該機群將繼續處理具有指定限制的任務。

# 建立限制
<a name="job-limit-create"></a>

您可以使用截止日期雲端主控台或[截止日期雲端 API 中的 CreateLimit 操作](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateLimit.html)來建立限制。限制是針對陣列定義，但與佇列相關聯。建立限制之後，您可以將其與一或多個佇列建立關聯。

**建立限制**

1. 從截止日期雲端主控台 ([截止日期雲端主控台](https://console.aws.amazon.com/deadlinecloud/home)) 儀表板中，選取您要為其建立佇列的陣列。

1. 選擇要新增限制的陣列，選擇**限制**索引標籤，然後選擇**建立限制**。

1. 提供限制的詳細資訊。**金額需求名稱**是任務範本中用來識別限制的名稱。它必須以字首開頭，**amount.**後面接著金額名稱。在與限制相關聯的佇列中，數量需求名稱必須是唯一的。

1. 如果您選擇**設定最大數量**，即此限制允許的資源總數。如果您選擇**無最大數量**，則資源用量不受限制。即使資源用量不受限制，也會發出 `CurrentCount` Amazon CloudWatch 指標，以便您可以追蹤用量。如需詳細資訊，請參閱*《截止日期雲端開發人員指南*》中的 [CloudWatch 指標](https://docs.aws.amazon.com/deadline-cloud/latest/developerguide/cloudwatch-metrics.html)。

1. 如果您已經知道應使用限制的佇列，現在可以選擇它們。您不需要關聯佇列即可建立限制。

1. 選擇**建立限制**。

# 關聯限制和佇列
<a name="job-limit-associate"></a>

建立限制之後，您可以將一或多個佇列與限制建立關聯。只有與限制相關聯的佇列會使用限制中指定的值。

您可以使用截止日期雲端主控台或[截止日期雲端 API 中的 CreateQueueLimitAssociation 操作](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueueLimitAssociation.html)來建立與佇列的關聯。

**將佇列與限制建立關聯**

1. 從截止日期雲端主控台 ([截止日期雲端主控台](https://console.aws.amazon.com/deadlinecloud/home)) 儀表板中，選取您要將限制與佇列建立關聯的陣列。

1. 選擇**限制**索引標籤，選擇要與佇列建立關聯的限制，然後選擇**編輯限制**。

1. 在**關聯佇列**區段中，選擇要與限制建立關聯的佇列。

1. 選擇**儲存變更**。

# 提交需要限制的任務
<a name="job-limit-job"></a>

您可以將限制指定為任務或任務步驟的主機需求，以套用限制。如果您未在步驟中指定限制，且該步驟使用相關聯的資源，則在排程任務時，該步驟的用量不會計入限制。

有些截止日期雲端提交者可讓您設定主機需求。您可以在提交者中指定限制的金額需求名稱，以套用限制。

如果您的提交者不支援新增主機需求，您也可以編輯任務的任務範本來套用限制。

**將限制套用至任務套件中的任務步驟**

1. 使用文字編輯器開啟任務的任務範本。任務範本位於任務的任務套件目錄中。如需詳細資訊，請參閱*《截止日期雲端開發人員指南*[》中的任務套件](https://docs.aws.amazon.com/deadline-cloud/latest/developerguide/build-job-bundle.html)。

1. 尋找要套用限制之步驟的步驟定義。

1. 將以下內容新增至步驟定義。將 *amount.name* 取代為您限制的數量需求名稱。對於一般用途，您應該將`min`值設定為 1。

------
#### [ YAML ]

   ```
     hostRequirements:
       amounts:
       - name: amount.name
         min: 1
   ```

------
#### [ JSON ]

   ```
   "hostRequirements": {
       "amounts": [
           {
               "name": "amount.name",
               "min": "1"
           }
       }
   }
   ```

------

   您可以在任務步驟中新增多個限制，如下所示。將 *amount.name\$11* 和 *amount.name\$12* 取代為您限制的數量需求名稱。

------
#### [ YAML ]

   ```
     hostRequirements:
       amounts:
       - name: amount.name_1
         min: 1
       - name: amount.name_2
         min: 1
   ```

------
#### [ JSON ]

   ```
   "hostRequirements": {
       "amounts": [
           {
               "name": "amount.name_1",
               "min": "1"
           },
           {
               "name": "amount.name_2",
               "min": "1"
           }
       }
   }
   ```

------

1. 將變更儲存至任務範本。

# 如何將任務提交至截止日期雲端
<a name="submit-jobs-how"></a>

有許多不同的方式可以將任務提交至 AWS 截止日期雲端。本節說明您可以使用 Deadline Cloud 提供的工具或為工作負載建立自訂工具來提交任務的一些方式。
+ 從終端機 – 當您第一次開發任務套件時，或當使用者使用命令列提交任務時
+ 從指令碼 – 用於自訂和自動化工作負載
+ 從應用程式 – 當使用者的工作在應用程式中時，或當應用程式的內容很重要時。

 下列範例使用 `deadline` Python 程式庫和`deadline`命令列工具。兩者皆可從 [PyPi](https://pypi.org/project/deadline/) 取得，並在 [ GitHub 上託管](https://github.com/aws-deadline/deadline-cloud)。

**Topics**
+ [從終端機將任務提交至截止日期雲端](from-a-terminal.md)
+ [使用指令碼將任務提交至截止日期雲端](from-a-script.md)
+ [在應用程式中提交任務](from-within-applications.md)

# 從終端機將任務提交至截止日期雲端
<a name="from-a-terminal"></a>

僅使用任務套件和截止日期雲端 CLI，您或您的技術性更高的使用者可以快速迭代撰寫任務套件，以測試提交任務。使用下列命令來提交任務套件：

```
deadline bundle submit <path-to-job-bundle>
```

 如果您使用套件中沒有預設值的參數提交任務套件，您可以使用 / `-p` `--parameter`選項指定它們。

```
deadline bundle submit <path-to-job-bundle> -p <parameter-name>=<parameter-value> -p ...
```

 如需可用選項的完整清單，請執行 help 命令：

```
deadline bundle submit --help
```

## 使用 GUI 將任務提交至截止日期雲端
<a name="with-a-submission-window"></a>

 截止日期雲端 CLI 也隨附圖形化使用者介面，可讓使用者查看在提交任務之前必須提供的參數。如果您的使用者不想與命令列互動，您可以撰寫桌面捷徑，開啟對話方塊以提交特定任務套件：

```
deadline bundle gui-submit <path-to-job-bundle>
```

 使用 `--browse`選項可以讓使用者選取任務套件：

```
deadline bundle gui-submit --browse
```

 如需可用選項的完整清單，請執行 help 命令：

```
deadline bundle gui-submit --help
```

# 使用指令碼將任務提交至截止日期雲端
<a name="from-a-script"></a>

 若要自動將任務提交至截止日期雲端，您可以使用 bash、Powershell 和批次檔案等工具編寫任務指令碼。

您可以新增功能，例如從環境變數或其他應用程式填入任務參數。您也可以在資料列中提交多個任務，或編寫要提交的任務套件建立指令碼。

## 使用 Python 提交任務
<a name="with-python"></a>

Deadline Cloud 也有開放原始碼 Python 程式庫，可與服務互動。[來源碼可在 GitHub 上取得](https://github.com/aws-deadline/deadline-cloud)。

此程式庫可透過 pip () 在 pypi 上提供`pip install deadline`。它與截止日期雲端 CLI 工具使用的程式庫相同：

```
from deadline.client import api

job_bundle_path = "/path/to/job/bundle"
job_parameters = [
    {
        "name": "parameter_name",
        "value": "parameter_value"
    },
]

job_id = api.create_job_from_job_bundle(
    job_bundle_path,
    job_parameters
)
print(job_id)
```

 若要建立類似 `deadline bundle gui-submit`命令的對話方塊，您可以從 使用 `show_job_bundle_submitter`函數[`deadline.client.ui.job_bundle_submitter`。](https://github.com/aws-deadline/deadline-cloud/blob/mainline/src/deadline/client/ui/job_bundle_submitter.py)

 下列範例會啟動 Qt 應用程式，並顯示任務套件提交者：

```
# The GUI components must be installed with pip install "deadline[gui]"
import sys
from qtpy.QtWidgets import QApplication
from deadline.client.ui.job_bundle_submitter import show_job_bundle_submitter

app = QApplication(sys.argv)
submitter = show_job_bundle_submitter(browse=True)
submitter.show()
app.exec()
print(submitter.create_job_response)
```

若要建立您自己的對話方塊，您可以在 中使用 `SubmitJobToDeadlineDialog`類別[https://github.com/aws-deadline/deadline-cloud/blob/mainline/src/deadline/client/ui/dialogs/submit_job_to_deadline_dialog.py](https://github.com/aws-deadline/deadline-cloud/blob/mainline/src/deadline/client/ui/dialogs/submit_job_to_deadline_dialog.py)。您可以傳入值、嵌入您自己的任務特定索引標籤，並判斷如何建立 （或傳入） 任務套件。

# 在應用程式中提交任務
<a name="from-within-applications"></a>

 若要讓使用者輕鬆提交任務，您可以使用 提供的指令碼執行時間或外掛程式系統。使用者擁有熟悉的界面，您可以建立強大的工具，協助使用者提交工作負載。

## 在應用程式中內嵌任務套件
<a name="simple-embedding"></a>

此範例示範提交您在應用程式中提供的任務套件。

 若要讓使用者存取這些任務套件，請建立內嵌在啟動截止日期雲端 CLI 的選單項目中的指令碼。

 下列指令碼可讓使用者選取任務套件：

```
deadline bundle gui-submit --install-gui
```

 若要改為在選單項目中使用特定任務套件，請使用下列項目：

```
deadline bundle gui-submit </path/to/job/bundle> --install-gui
```

 這會開啟一個對話方塊，使用者可以修改任務參數、輸入和輸出，然後提交任務。您可以為使用者在應用程式中提交的不同任務套件擁有不同的功能表項目。

如果您使用任務套件提交的任務包含類似的參數和跨提交的資產參考，您可以在基礎任務套件中填寫預設值。

## 從應用程式取得資訊
<a name="deep-integration"></a>

若要從應用程式提取資訊，讓使用者不必手動將其新增至提交，您可以將 Deadline Cloud 與應用程式整合，讓使用者可以使用熟悉的界面提交任務，而無需結束應用程式或使用命令列工具。

如果您的應用程式具有支援 Python 和 pyside/pyqt 的指令碼執行期，您可以使用[截止日期雲端用戶端程式庫](https://github.com/aws-deadline/deadline-cloud)中的 GUI 元件來建立 UI。如需範例，請參閱 GitHub [上 Maya 整合的截止日期雲端](https://github.com/aws-deadline/deadline-cloud-for-maya)。

Deadline Cloud 用戶端程式庫提供下列操作，協助您提供強大的整合使用者體驗：
+ 提取佇列環境參數、任務參數和資產參考表單環境變數，並呼叫應用程式 SDK。
+ 設定任務套件中的參數。為了避免修改原始套件，您應該複製套件並提交副本。

如果您使用 `deadline bundle gui-submit`命令來提交任務套件，您必須以程式設計方式 `parameter_values.yaml`和 `asset_references.yaml` 檔案，以從應用程式傳遞資訊。如需這些檔案的詳細資訊，請參閱 [截止日期雲端的開啟任務描述 (OpenJD) 範本](build-job-bundle.md)。

如果您需要比 OpenJD 提供的控制項更複雜的控制項、需要從使用者抽象化任務，或想要使整合符合應用程式的視覺化樣式，您可以撰寫自己的對話方塊，呼叫截止日期雲端用戶端程式庫來提交任務。

# 在截止日期雲端中排程任務
<a name="build-jobs-scheduling"></a>

建立任務之後， AWS 截止日期 Cloud 會將任務排程在與佇列相關聯的一或多個機群上進行處理。根據為機群設定的功能和特定步驟的主機需求，選擇處理特定任務的機群。

佇列中的任務會以最盡力的優先順序排定，從最高到最低。當兩個任務具有相同的優先順序時，會先排程最舊的任務。

下列各節提供排程任務程序的詳細資訊。

## 判斷機群相容性
<a name="jobs-scheduling-compatibility"></a>

建立任務後，截止日期雲端會根據與提交任務的佇列相關聯的機群功能，檢查任務中每個步驟的主機需求。如果機群符合主機需求，任務會進入 `READY` 狀態。

如果任務中的任何步驟具有與佇列相關聯的機群無法滿足的需求，則該步驟的狀態會設為 `NOT_COMPATIBLE`。此外，任務中的其餘步驟也會取消。

機群的功能是在機群層級設定。即使機群中的工作者符合任務的需求，如果其機群不符合任務的需求，則不會從任務指派任務。

下列任務範本有一個步驟，指定步驟的主機需求：

```
name: Sample Job With Host Requirements
specificationVersion: jobtemplate-2023-09
steps:
- name: Step 1
  script:
    actions:
      onRun:
        args:
        - '1'
        command: /usr/bin/sleep
  hostRequirements:
    amounts:
    # Capabilities starting with "amount." are amount capabilities. If they start with "amount.worker.",
    # they are defined by the OpenJD specification. Other names are free for custom usage.
    - name: amount.worker.vcpu
      min: 4
      max: 8
    attributes:
    - name: attr.worker.os.family
      anyOf:
      - linux
```

此任務可以排程到具有下列功能的機群：

```
{
    "vCpuCount": {"min": 4, "max": 8},
    "memoryMiB": {"min": 1024},
    "osFamily": "linux",
    "cpuArchitectureType": "x86_64"
}
```

此任務無法排程到具有下列任何功能的機群：

```
{
    "vCpuCount": {"min": 4},
    "memoryMiB": {"min": 1024},
    "osFamily": "linux",
    "cpuArchitectureType": "x86_64"
}
    The vCpuCount has no maximum, so it exceeds the maximum vCPU host requirement.
    
{
    "vCpuCount": {"max": 8},
    "memoryMiB": {"min": 1024},
    "osFamily": "linux",
    "cpuArchitectureType": "x86_64"
}
    The vCpuCount has no minimum, so it doesn't satisfy the minimum vCPU host requirement.

{
    "vCpuCount": {"min": 4, "max": 8},
    "memoryMiB": {"min": 1024},
    "osFamily": "windows",
    "cpuArchitectureType": "x86_64"
}    
    The osFamily doesn't match.
```

## 機群擴展
<a name="jobs-scheduling-scaling"></a>

當任務指派給相容的服務受管機群時，機群會自動擴展。機群中的工作者數量會根據機群可執行的任務數量而變更。

當任務指派給客戶管理的機群時，工作者可能已經存在，或者可以使用事件型自動擴展來建立。如需詳細資訊，請參閱《Amazon EC2 Auto Scaling 使用者指南》中的[使用 EventBridge 來處理自動擴展事件](https://docs.aws.amazon.com/autoscaling/ec2/userguide/automating-ec2-auto-scaling-with-eventbridge.html)。 *Amazon EC2 Auto Scaling *

## 工作階段
<a name="jobs-scheduling-sessions"></a>

任務中的任務分為一或多個工作階段。工作者會執行工作階段來設定環境、執行任務，然後銷毀環境。每個工作階段都由工作者必須採取的一或多個動作組成。

當工作者完成區段動作時，可以將其他工作階段動作傳送給工作者。工作者會在工作階段中重複使用現有的環境和任務附件，以更有效率的方式完成任務。

在服務受管機群工作者上，工作階段目錄會在工作階段結束後刪除，但在工作階段之間保留其他目錄。此行為可讓您針對可在多個工作階段間重複使用的資料實作快取策略。若要快取工作階段之間的資料，請將資料存放在執行任務之使用者的主目錄下。例如，Conda 套件會在Windows工作者和`/home/job-user/.conda-pkgs`Linux工作者`C:\Users\job-user\.conda-pkgs`上的 的任務使用者主目錄下快取。在工作者關閉之前，此資料仍然可用。

任務附件是由做為截止日期 Cloud CLI 任務套件一部分的提交者建立。您也可以使用 `create-job` AWS CLI 命令的 `--attachments`選項來建立任務附件。環境定義在兩個位置：連接到特定佇列的佇列環境，以及任務範本中定義的任務和步驟環境。

有四種工作階段動作類型：
+ `syncInputJobAttachments` – 將輸入任務附件下載至工作者。
+ `envEnter` – 執行環境`onEnter`的動作。
+ `taskRun` – 執行任務`onRun`的動作。
+ `envExit` – 執行環境`onExit`的動作。

下列任務範本具有步驟環境。它具有設定步驟環境`onEnter`的定義、定義要執行之任務`onRun`的定義，以及縮減步驟環境`onExit`的定義。為此任務建立的工作階段將包含 `envEnter`動作、一或多個`taskRun`動作，以及 `envExit`動作。

```
name: Sample Job with Maya Environment
specificationVersion: jobtemplate-2023-09
steps:
- name: Maya Step
  stepEnvironments:
  - name: Maya
    description: Runs Maya in the background.
    script:
      embeddedFiles:
      - name: initData
        filename: init-data.yaml
        type: TEXT
        data: |
          scene_file: MyAwesomeSceneFile
          renderer: arnold
          camera: persp
      actions:
        onEnter:
          command: MayaAdaptor
          args:
          - daemon
          - start
          - --init-data
          - file://{{Env.File.initData}}
        onExit:
          command: MayaAdaptor
          args:
          - daemon
          - stop
  parameterSpace:
    taskParameterDefinitions:
    - name: Frame
      range: 1-5
      type: INT
  script:
    embeddedFiles:
    - name: runData
      filename: run-data.yaml
      type: TEXT
      data: |
        frame: {{Task.Param.Frame}}
    actions:
      onRun:
        command: MayaAdaptor
        args:
        - daemon
        - run
        - --run-data
        - file://{{ Task.File.runData }}
```

### 工作階段動作管道
<a name="jobs-session-pipelining"></a>

工作階段動作管道可讓排程器將多個工作階段動作預先指派給工作者。工作者接著可以依序執行這些動作，減少或消除任務之間的閒置時間。

若要建立初始指派，排程器會建立一個具有一個任務的工作階段、工作者完成任務，然後排程器會分析任務持續時間以判斷未來的指派。

為了讓排程器有效，有任務持續時間規則。對於一分鐘內的任務，排程器會使用 2 號動力成長模式。例如，對於 1 秒的任務，排程器會指派 2 個新任務，然後 4 個新任務，然後 8 個新任務。對於超過一分鐘的任務，排程器只會指派一個新任務，且管道會保持停用狀態。

若要計算管道大小，排程器會執行下列動作：
+ 使用已完成任務的平均任務持續時間
+ 旨在讓工作者保持忙碌一分鐘
+ 僅考慮相同工作階段中的任務
+ 不跨工作者共用持續時間資料

隨著工作階段動作繁衍，工作者會立即開始新的任務，而且排程器請求之間沒有等待時間。它也為長時間執行的程序提供更高的工作者效率和更好的任務分佈。

此外，如果有新的較高優先順序任務可用，工作者將在目前的工作階段結束之前完成所有先前指派的工作，並指派較高優先順序任務的新工作階段。

## 步驟相依性
<a name="jobs-scheduling-dependencies"></a>

Deadline Cloud 支援在步驟之間定義相依性，讓一個步驟等待另一個步驟完成再開始。您可以為步驟定義多個相依性。在其所有相依性完成之前，不會排程具有相依性的步驟。

如果任務範本定義循環相依性，則會拒絕任務，並將任務狀態設定為 `CREATE_FAILED`。

下列任務範本會建立具有兩個步驟的任務。 `StepB` 取決於 `StepA`。 `StepB`只會在 `StepA` 成功完成後執行。

建立任務後， `StepA` 會處於 `READY` 狀態，並`StepB`處於 `PENDING` 狀態。`StepA` 完成後， `StepB`會移至 `READY` 狀態。如果 `StepA` 失敗，或`StepA`如果 已取消，則 `StepB`會移至 `CANCELED` 狀態。

您可以設定多個步驟的相依性。例如，如果 同時`StepC`取決於 `StepA`和 `StepB`，則在另外兩個步驟完成之前， `StepC`不會開始。

步驟相依性有下列限制：
+ **每個步驟的相依性** – 步驟最多可以依賴其他 128 個步驟。
+ **每個步驟的取用**者 – 最多 32 個其他步驟可以取決於單一步驟。

```
name: Step-Step Dependency Test
specificationVersion: 'jobtemplate-2023-09'
steps:
- name: A
  script:
    actions:
      onRun:
        command: bash
        args: ['{{ Task.File.run }}']
    embeddedFiles:
      - name: run
        type: TEXT
        data: |
          #!/bin/env bash

          set -euo pipefail

          sleep 1
          echo Task A Done!
- name: B
  dependencies:
  - dependsOn: A # This means Step B depends on Step A
  script:
    actions:
      onRun:
        command: bash
        args: ['{{ Task.File.run }}']
    embeddedFiles:
      - name: run
        type: TEXT
        data: |
          #!/bin/env bash

          set -euo pipefail

          sleep 1
          echo Task B Done!
```

# 在截止日期雲端中修改任務
<a name="build-jobs-modifying"></a>

您可以使用下列 AWS Command Line Interface (AWS CLI) `update`命令來修改任務的組態，或設定任務、步驟或任務的目標狀態： ``
+ `aws deadline update-job`
+ `aws deadline update-step`
+ `aws deadline update-task`

在下列 `update`命令範例中，將每個 取代*`user input placeholder`*為您自己的資訊。

**Example – 將任務排入佇列**  
除非有步驟相依性，否則任務中的所有任務都會切換到 `READY` 狀態。具有相依性的步驟會在還原`PENDING`時切換到 `READY`或 。  

```
aws deadline update-job \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--target-task-run-status PENDING
```

**Example – 取消任務**  
任務中沒有 狀態`SUCCEEDED`或`FAILED`標記為 的所有任務`CANCELED`。  

```
aws deadline update-job \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--target-task-run-status CANCELED
```

**Example – 標記任務失敗**  
任務中狀態為 的所有任務`SUCCEEDED`都保持不變。所有其他任務都會標示為 `FAILED`。  

```
aws deadline update-job \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--target-task-run-status FAILED
```

**Example – 成功標記任務**  
任務中的所有任務都會移至 `SUCCEEDED` 狀態。  

```
aws deadline update-job \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--target-task-run-status SUCCEEDED
```

**Example – 暫停任務**  
`SUCCEEDED`、 `CANCELED`或 `FAILED` 狀態的任務不會變更。所有其他任務都會標示為 `SUSPENDED`。  

```
aws deadline update-job \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--target-task-run-status SUSPENDED
```

**Example – 變更任務的優先順序**  
更新佇列中任務的優先順序，以變更其排程的順序。較高優先順序的任務通常會先排程。  

```
aws deadline update-job \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--priority 100
```

**Example – 變更允許的失敗任務數量**  
在取消其餘任務之前，更新任務可擁有的失敗任務數量上限。  

```
aws deadline update-job \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--max-failed-tasks-count 200
```

**Example – 變更允許的任務重試次數**  
在任務失敗之前，更新任務的重試次數上限。達到重試次數上限的任務無法重新排入佇列，直到此值增加為止。  

```
aws deadline update-job \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--max-retries-per-task 10
```

**Example – 封存任務**  
將任務的生命週期狀態更新為 `ARCHIVED`。封存的任務無法排程或修改。您只能封存處於 `FAILED`、`SUCCEEDED`、 `CANCELED`或 `SUSPENDED` 狀態的任務。  

```
aws deadline update-job \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--lifecycle-status ARCHIVED
```

**Example – 變更任務的名稱**  
更新任務的顯示名稱。任務名稱長度最多可達 128 個字元。  

```
aws deadline update-job \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--name "New Job Name"
```

**Example – 變更任務的描述**  
更新任務的描述。描述長度最多可達 2048 個字元。若要移除現有的描述，請傳遞空字串。  

```
aws deadline update-job \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--description "New Job Description"
```

**Example – 將步驟排入佇列**  
除非有步驟相依性，否則步驟中的所有任務都會切換到 `READY` 狀態。具有相依性的步驟中的任務會切換到 `READY`或 `PENDING`，並還原任務。  

```
aws deadline update-step \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--step-id stepID \
--target-task-run-status PENDING
```

**Example – 取消步驟**  
步驟中沒有 狀態`SUCCEEDED`或`FAILED`標記為 的所有任務`CANCELED`。  

```
aws deadline update-step \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--step-id stepID \
--target-task-run-status CANCELED
```

**Example – 標記步驟失敗**  
該步驟中狀態為 的所有任務`SUCCEEDED`都保持不變。所有其他任務都會標示為 `FAILED`。  

```
aws deadline update-step \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--step-id stepID \
--target-task-run-status FAILED
```

**Example – 將步驟標記為成功**  
步驟中的所有任務都會標示為 `SUCCEEDED`。  

```
aws deadline update-step \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--step-id stepID \
--target-task-run-status SUCCEEDED
```

**Example – 暫停步驟**  
`SUCCEEDED`、 `CANCELED`或 `FAILED` 狀態的步驟中的任務不會變更。所有其他任務都會標示為 `SUSPENDED`。  

```
aws deadline update-step \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--step-id stepID \
--target-task-run-status SUSPENDED
```

**Example – 變更任務的狀態**  
當您使用`update-task`截止日期雲端 CLI 命令時，任務會切換到指定的狀態。  

```
aws deadline update-task \
--farm-id farmID \
--queue-id queueID \
--job-id jobID \
--step-id stepID \
--task-id taskID \
--target-task-run-status SUCCEEDED | SUSPENDED | CANCELED | FAILED | PENDING
```