

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

# 在截止日期雲端中使用任務附件提交任務
<a name="run-jobs-job-attachments"></a>

許多陣列會使用共用檔案系統，在提交任務的主機與執行任務的主機之間共用檔案。例如，在先前的`simple_file_job`範例中，本機檔案系統是在 AWS CloudShell 終端機視窗之間共用，其會在您提交任務的索引標籤 1 中執行，並在您執行工作者代理程式的索引標籤 2 中執行。

當提交者工作站和工作者主機位於相同的區域網路上時，共用檔案系統是有利的。如果您將資料存放在靠近存取它的工作站的現場部署，則使用雲端型陣列表示您必須透過高延遲 VPN 共用檔案系統，或在雲端同步檔案系統。這些選項都不容易設定或操作。

AWS Deadline Cloud 提供具有*任務附件*的簡單解決方案，類似於電子郵件附件。使用任務附件，您可以將資料連接到任務。然後，截止日期雲端會處理在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中傳輸和儲存任務資料的詳細資訊。

內容建立工作流程通常是反覆的，這表示使用者提交具有一小部分修改檔案的任務。由於 Amazon S3 儲存貯體會將任務附件存放在內容可定址的儲存體中，因此每個物件的名稱都是以物件資料的雜湊為基礎，目錄樹狀目錄的內容會以附加至任務的資訊清單檔案格式儲存。

您必須先完成下列操作，才能遵循本節中的程序：
+ [建立截止日期雲端陣列](create-a-farm.md)
+ [執行截止日期雲端工作者代理程式](run-worker.md)

若要使用任務附件執行任務，請完成下列步驟。

**Topics**
+ [將任務附件組態新增至佇列](#job-attachments-config)
+ [simple\_file\_job 使用任務附件提交](#submit-job-attachments)
+ [了解任務附件如何儲存在 Amazon S3 中](#job-attachments-in-depth)
+ [後續步驟](#run-jobs-job-attachments-next)

## 將任務附件組態新增至佇列
<a name="job-attachments-config"></a>

若要在佇列中啟用任務附件，請將任務附件組態新增至帳戶中的佇列資源。

**將任務附件組態新增至佇列**

1. 選擇您的第一個 CloudShell 索引標籤，然後輸入下列其中一個命令，以使用 Amazon S3 儲存貯體做為任務附件。
   + 如果您沒有現有的私有 Amazon S3 儲存貯體，您可以建立和使用新的 S3 儲存貯體。

     ```
     DEV_FARM_BUCKET=$(echo $DEV_FARM_NAME \
         | tr '[:upper:]' '[:lower:]')-$(xxd -l 16 -p /dev/urandom)
     if [ "$AWS_REGION" == "us-east-1" ]; then LOCATION_CONSTRAINT=
     else LOCATION_CONSTRAINT="--create-bucket-configuration \
         LocationConstraint=${AWS_REGION}"
     fi
     aws s3api create-bucket \
         $LOCATION_CONSTRAINT \
         --acl private \
         --bucket ${DEV_FARM_BUCKET}
     ```
   + 如果您已有私有 Amazon S3 儲存貯體，您可以使用它，方法是將 {{`MY_BUCKET_NAME`}}取代為儲存貯體的名稱。

     ```
     DEV_FARM_BUCKET={{MY_BUCKET_NAME}}
     ```

1. 建立或選擇 Amazon S3 儲存貯體之後，請將儲存貯體名稱新增至 `~/.bashrc`，讓儲存貯體可供其他終端機工作階段使用。

   ```
   echo "DEV_FARM_BUCKET=$DEV_FARM_BUCKET" >> ~/.bashrc
    source ~/.bashrc
   ```

1. 為佇列建立 AWS Identity and Access Management (IAM) 角色。

   ```
   aws iam create-role --role-name "${DEV_FARM_NAME}QueueRole" \
       --assume-role-policy-document \
           '{
               "Version": "2012-10-17",		 	 	 
               "Statement": [
                   {
                       "Effect": "Allow",
                       "Principal": {
                           "Service": "credentials.deadline.amazonaws.com"
                       },
                       "Action": "sts:AssumeRole"
                   }
               ]
           }'
   aws iam put-role-policy \
       --role-name "${DEV_FARM_NAME}QueueRole" \
       --policy-name S3BucketsAccess \
       --policy-document \
               '{
                   "Version": "2012-10-17",		 	 	 
                   "Statement": [
                   {
                       "Action": [
                           "s3:GetObject*",
                           "s3:GetBucket*",
                           "s3:List*",
                           "s3:DeleteObject*",
                           "s3:PutObject",
                           "s3:PutObjectLegalHold",
                           "s3:PutObjectRetention",
                           "s3:PutObjectTagging",
                           "s3:PutObjectVersionTagging",
                           "s3:Abort*"
                       ],
                       "Resource": [
                           "arn:aws:s3:::'$DEV_FARM_BUCKET'",
                           "arn:aws:s3:::'$DEV_FARM_BUCKET'/*"
                       ],
                       "Effect": "Allow"
                   }
               ]
               }'
   ```

1. 更新您的佇列以包含任務附件設定和 IAM 角色。

   ```
   QUEUE_ROLE_ARN="arn:aws:iam::$(aws sts get-caller-identity \
           --query "Account" --output text):role/${DEV_FARM_NAME}QueueRole"
   aws deadline update-queue \
       --farm-id $DEV_FARM_ID \
       --queue-id $DEV_QUEUE_ID \
       --role-arn $QUEUE_ROLE_ARN \
       --job-attachment-settings \
           '{
               "s3BucketName": "'$DEV_FARM_BUCKET'",
               "rootPrefix": "JobAttachments"
           }'
   ```

1. 確認您已更新佇列。

   ```
   deadline queue get
   ```

   如下所示的輸出：

   ```
   ...
   jobAttachmentSettings:
     s3BucketName: DEV_FARM_BUCKET
     rootPrefix: JobAttachments
   roleArn: arn:aws:iam::ACCOUNT_NUMBER:role/DeveloperFarmQueueRole
   ...
   ```

## simple\_file\_job 使用任務附件提交
<a name="submit-job-attachments"></a>

當您使用任務附件時，任務套件必須提供 Deadline Cloud 足夠的資訊來判斷任務的資料流程，例如使用`PATH`參數。在 的情況下simple\_file\_job，您編輯了 `template.yaml` 檔案，以告知 Deadline Cloud 資料流程位於輸入檔案和輸出檔案中。

將任務附件組態新增至佇列後，您可以提交具有任務附件的 simple\_file\_job 範例。執行此操作後，您可以檢視記錄和任務輸出，以確認simple\_file\_job具有任務附件的 正常運作。

**使用任務附件提交 simple\_file\_job 任務套件**

1. 選擇您的第一個 CloudShell 標籤，然後開啟`JobBundle-Samples`目錄。

1. 

   ```
   cd ~/deadline-cloud-samples/job_bundles/
   ```

1. 將 simple\_file\_job 提交至佇列。出現確認上傳的提示時，請輸入 **y**。

   ```
   deadline bundle submit simple_file_job \
       -p InFile=simple_job/template.yaml \
       -p OutFile=hash-jobattachments.txt
   ```

1. 若要檢視任務連接資料傳輸工作階段日誌輸出，請執行下列命令。

   ```
   JOB_ID=$(deadline config get defaults.job_id)
   SESSION_ID=$(aws deadline list-sessions \
           --farm-id $DEV_FARM_ID \
           --queue-id $DEV_QUEUE_ID \
           --job-id $JOB_ID \
           --query "sessions[0].sessionId" \
           --output text)
   cat ~/demoenv-logs/$DEV_QUEUE_ID/$SESSION_ID.log
   ```

1. 列出在工作階段中執行的工作階段動作。

   ```
   aws deadline list-session-actions \
       --farm-id $DEV_FARM_ID \
       --queue-id $DEV_QUEUE_ID \
       --job-id $JOB_ID \
       --session-id $SESSION_ID
   ```

   如下所示的輸出：

   ```
   {
       "sessionactions": [
           {
               "sessionActionId": "sessionaction-123-0",
               "status": "SUCCEEDED",
               "startedAt": "<timestamp>",
               "endedAt": "<timestamp>",
               "progressPercent": 100.0,
               "definition": {
                   "syncInputJobAttachments": {}
               }
           },
           {
               "sessionActionId": "sessionaction-123-1",
               "status": "SUCCEEDED",
               "startedAt": "<timestamp>",
               "endedAt": "<timestamp>",
               "progressPercent": 100.0,
               "definition": {
                   "taskRun": {
                       "taskId": "task-abc-0",
                       "stepId": "step-def"
                   }
               }
           }
       ]
   }
   ```

   第一個工作階段動作會下載輸入任務附件，而第二個動作會像先前步驟一樣執行任務，然後上傳輸出任務附件。

1. 列出輸出目錄。

   ```
   ls *.txt
   ```

   目錄中`hash.txt`存在 等輸出，但`hash-jobattachments.txt`由於任務的輸出檔案尚未下載，因此不存在。

1. 從最近的任務下載輸出。

   ```
   deadline job download-output
   ```

1. 檢視下載檔案的輸出。

   ```
   cat hash-jobattachments.txt
   ```

   如下所示的輸出：

   ```
   eaa2df5d34b54be5ac34c56a24a8c237b8487231a607eaf530a04d76b89c9cd3  /tmp/openjd/session-123/assetroot-abc/simple_job/template.yaml
   ```

## 了解任務附件如何儲存在 Amazon S3 中
<a name="job-attachments-in-depth"></a>

您可以使用 AWS Command Line Interface (AWS CLI) 上傳或下載存放在 Amazon S3 儲存貯體的任務附件資料。了解 Deadline Cloud 如何在 Amazon S3 上存放任務附件，有助於您開發工作負載和管道整合。

**檢查截止日期雲端任務附件在 Amazon S3 中的存放方式**

1. 選擇您的第一個 CloudShell 索引標籤，然後開啟任務套件範例目錄。

   ```
   cd ~/deadline-cloud-samples/job_bundles/
   ```

1. 檢查任務屬性。

   ```
   deadline job get
   ```

   如下所示的輸出：

   ```
   parameters:
     Message:
       string: Welcome to AWS Deadline Cloud!
     InFile:
       path: /home/cloudshell-user/deadline-cloud-samples/job_bundles/simple_job/template.yaml
     OutFile:
       path: /home/cloudshell-user/deadline-cloud-samples/job_bundles/hash-jobattachments.txt
   attachments:
     manifests:
     - rootPath: /home/cloudshell-user/deadline-cloud-samples/job_bundles/
       rootPathFormat: posix
       outputRelativeDirectories:
       - .
       inputManifestPath: farm-3040c59a5b9943d58052c29d907a645d/queue-cde9977c9f4d4018a1d85f3e6c1a4e6e/Inputs/f46af01ca8904cd8b514586671c79303/0d69cd94523ba617c731f29c019d16e8_input.xxh128
       inputManifestHash: f95ef91b5dab1fc1341b75637fe987ee
     fileSystem: COPIED
   ```

   附件欄位包含資訊清單結構清單，描述任務執行時使用的輸入和輸出資料路徑。查看 `rootPath` 以查看提交任務之電腦上的本機目錄路徑。若要檢視包含資訊清單檔案的 Amazon S3 物件尾碼，請檢閱 `inputManifestFile`。資訊清單檔案包含任務輸入資料的目錄樹狀目錄快照的中繼資料。

1. Pretty 列印 Amazon S3 資訊清單物件，以查看任務的輸入目錄結構。

   ```
   MANIFEST_SUFFIX=$(aws deadline get-job \
        --farm-id $DEV_FARM_ID \
        --queue-id $DEV_QUEUE_ID \
        --job-id $JOB_ID \
        --query "attachments.manifests[0].inputManifestPath" \
        --output text)
    aws s3 cp s3://$DEV_FARM_BUCKET/JobAttachments/Manifests/$MANIFEST_SUFFIX - | jq .
   ```

   如下所示的輸出：

   ```
   {
        "hashAlg": "xxh128",
        "manifestVersion": "2023-03-03",
        "paths": [
        {
            "hash": "2ec297b04c59c4741ed97ac8fb83080c",
            "mtime": 1698186190000000,
            "path": "simple_job/template.yaml",
            "size": 445
        }
        ],
        "totalSize": 445
    }
   ```

1. 建構 Amazon S3 字首，其中包含輸出任務附件的資訊清單，並在其中列出物件。

   ```
   SESSION_ACTION=$(aws deadline list-session-actions \
       --farm-id $DEV_FARM_ID \
       --queue-id $DEV_QUEUE_ID \
       --job-id $JOB_ID \
       --session-id $SESSION_ID \
       --query "sessionActions[?definition.taskRun != null] | [0]")
   STEP_ID=$(echo $SESSION_ACTION | jq -r .definition.taskRun.stepId)
   TASK_ID=$(echo $SESSION_ACTION | jq -r .definition.taskRun.taskId)
   TASK_OUTPUT_PREFIX=JobAttachments/Manifests/$DEV_FARM_ID/$DEV_QUEUE_ID/$JOB_ID/$STEP_ID/$TASK_ID/
   aws s3api list-objects-v2 --bucket $DEV_FARM_BUCKET --prefix $TASK_OUTPUT_PREFIX
   ```

   輸出任務附件不會直接從任務資源中參考，而是根據陣列資源 IDs 放置在 Amazon S3 儲存貯體中。

1. 取得特定工作階段動作 ID 的最新資訊清單物件金鑰，然後漂亮地列印資訊清單物件。

   ```
   SESSION_ACTION_ID=$(echo $SESSION_ACTION | jq -r .sessionActionId)
    MANIFEST_KEY=$(aws s3api list-objects-v2 \
        --bucket $DEV_FARM_BUCKET \
        --prefix $TASK_OUTPUT_PREFIX \
        --query "Contents[*].Key" --output text \
        | grep $SESSION_ACTION_ID \
        | sort | tail -1)
    MANIFEST_OBJECT=$(aws s3 cp s3://$DEV_FARM_BUCKET/$MANIFEST_KEY -)
    echo $MANIFEST_OBJECT | jq .
   ```

   您會在輸出`hash-jobattachments.txt`中看到 檔案的屬性，如下所示：

   ```
   {
        "hashAlg": "xxh128",
        "manifestVersion": "2023-03-03",
        "paths": [
        {
            "hash": "f60b8e7d0fabf7214ba0b6822e82e08b",
            "mtime": 1698785252554950,
            "path": "hash-jobattachments.txt",
            "size": 182
        }
        ],
        "totalSize": 182
    }
   ```

   您的任務每個任務執行只會有單一資訊清單物件，但一般而言，每個任務執行可能會有更多物件。

1. 在`Data`字首下檢視內容可定址的 Amazon S3 儲存輸出。

   ```
    FILE_HASH=$(echo $MANIFEST_OBJECT | jq -r .paths[0].hash)
    FILE_PATH=$(echo $MANIFEST_OBJECT | jq -r .paths[0].path)
    aws s3 cp s3://$DEV_FARM_BUCKET/JobAttachments/Data/$FILE_HASH -
   ```

   如下所示的輸出：

   ```
   eaa2df5d34b54be5ac34c56a24a8c237b8487231a607eaf530a04d76b89c9cd3  /tmp/openjd/session-123/assetroot-abc/simple_job/template.yaml
   ```

## 後續步驟
<a name="run-jobs-job-attachments-next"></a>

了解如何使用截止日期雲端 CLI 提交具有附件的任務之後，您可以探索：
+ [使用截止日期雲端提交](submit-a-job.md) 了解如何在工作者主機上使用 OpenJD 套件執行任務。
+ [在截止日期雲端中將服務受管機群新增至您的開發人員陣列](service-managed-fleet.md) 在 Deadline Cloud 管理的主機上執行您的任務。
+ [在截止日期雲端中清除您的陣列資源](cleaning-up.md) 關閉您用於本教學課程的資源。