如何在受管運算環境中將 Amazon EFS 磁碟區掛載到 AWS Batch?

3 分的閱讀內容
0

我想在 AWS Batch 中掛載 Amazon Elastic File System (Amazon EFS) 磁碟區。如何在不建立自訂 Amazon Machine Image (AMI) 的情況下在受管運算環境中執行此操作?

簡短描述

**注意:**AWS Batch 現在支援將 EFS 磁碟區直接掛載到建立的容器,作為任務定義的一部分。這是比本文中提到的解決方法更簡單的方法。如需詳細資訊,請參閱在任務定義中指定 Amazon EFS 檔案系統容器屬性中的 efsVolumeConfiguration 參數。

使用啟動範本將 Amazon EFS 磁碟區掛載到 EC2 執行個體,然後掛載到容器。這也可讓您透過 AWS Batch 將 EFS 磁碟區掛載到容器,而無需建立自訂 AMI

**重要事項:**建立 Amazon EFS 磁碟區時,請使用指派給運算環境的相同 Amazon Virtual Private Cloud (Amazon VPC) 和子網路。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請確認您使用的是最新的 AWS CLI 版本

1.    建立 Amazon EFS 檔案系統

2.    記下檔案系統 ID (例如:fs-12345678)。您需要檔案系統 ID 才能執行啟動範本。

3.    建立啟動範本,其中包含使用者資料區段,並使用 MIME 分段檔案格式。如需詳細資訊,請參閱 Cloud-init 網站上的 Mime 分段封存

MIME 分段檔案範例

**注意:**下面的 MIME 分段檔案範例會設定運算資源來安裝 amazon-efs-utils 套件。然後,檔案會在 /mnt/efs 掛載現有的 Amazon EFS 檔案系統。

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="

--==MYBOUNDARY==
Content-Type: text/cloud-config; charset="us-ascii"

packages:
- amazon-efs-utils

runcmd:
- file_system_id_01=fs-12345678
- efs_directory=/mnt/efs

- mkdir -p ${efs_directory}
- echo "${file_system_id_01}:/ ${efs_directory} efs tls,_netdev" >> /etc/fstab
- mount -a -t efs defaults

--==MYBOUNDARY==--

**重要事項:**使用您的檔案系統 ID 取代 fs-12345678

4.    建立名為 mount-efs.json 的檔案。

**注意:**根據需要調整磁碟區的大小。

Amazon Linux 2 啟動範本範例

{
  "LaunchTemplateName": "user-data",
  "LaunchTemplateData": {
    "BlockDeviceMappings": [
      {
        "Ebs": {
          "DeleteOnTermination": true,
          "VolumeSize": 30,
          "VolumeType": "gp2"
        },
        "DeviceName": "/dev/xvda"
      }
    ],
    "UserData": "TUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSI9PU1ZQk9VTkRBUlk9PSIKCi0tPT1NWUJPVU5EQVJZPT0KQ29udGVudC1UeXBlOiB0ZXh0L2Nsb3VkLWNvbmZpZzsgY2hhcnNldD0idXMtYXNjaWkiCgpwYWNrYWdlczoKLSBhbWF6b24tZWZzLXV0aWxzCgpydW5jbWQ6Ci0gZmlsZV9zeXN0ZW1faWRfMDE9ZnMtODc0MTc4MDYgICAgIAotIGVmc19kaXJlY3Rvcnk9L21udC9lZnMKCi0gbWtkaXIgLXAgJHtlZnNfZGlyZWN0b3J5fQotIGVjaG8gIiR7ZmlsZV9zeXN0ZW1faWRfMDF9Oi8gJHtlZnNfZGlyZWN0b3J5fSBlZnMgdGxzLF9uZXRkZXYiID4+IC9ldGMvZnN0YWIKLSBtb3VudCAtYSAtdCBlZnMgZGVmYXVsdHMKCi0tPT1NWUJPVU5EQVJZPT0tLQ=="
  }
}

Amazon Linux 1 啟動範本範例

{
  "LaunchTemplateName": "userdata",
  "LaunchTemplateData": {
    "BlockDeviceMappings": [
      {
        "Ebs": {
          "DeleteOnTermination": true,
          "VolumeSize": 8,
          "VolumeType": "gp2"
        },
        "DeviceName": "/dev/xvda"
      },
      {
        "Ebs": {
          "DeleteOnTermination": true,
          "VolumeSize": 22,
          "VolumeType": "gp2"
        },
        "DeviceName": "/dev/xvdcz"
      }
    ],
    "UserData": "TUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSI9PU1ZQk9VTkRBUlk9PSIKCi0tPT1NWUJPVU5EQVJZPT0KQ29udGVudC1UeXBlOiB0ZXh0L2Nsb3VkLWNvbmZpZzsgY2hhcnNldD0idXMtYXNjaWkiCgpwYWNrYWdlczoKLSBhbWF6b24tZWZzLXV0aWxzCgpydW5jbWQ6Ci0gZmlsZV9zeXN0ZW1faWRfMDE9ZnMtODc0MTc4MDYgICAgIAotIGVmc19kaXJlY3Rvcnk9L21udC9lZnMKCi0gbWtkaXIgLXAgJHtlZnNfZGlyZWN0b3J5fQotIGVjaG8gIiR7ZmlsZV9zeXN0ZW1faWRfMDF9Oi8gJHtlZnNfZGlyZWN0b3J5fSBlZnMgdGxzLF9uZXRkZXYiID4+IC9ldGMvZnN0YWIKLSBtb3VudCAtYSAtdCBlZnMgZGVmYXVsdHMKCi0tPT1NWUJPVU5EQVJZPT0tLQ=="
  }
}

**重要事項:**如果您將使用者資料新增至 Amazon Elastic Compute Cloud (Amazon EC2) 主控台中的啟動範本,請確保執行下列其中一項操作:
以純文字格式貼上使用者資料。
-或-
從檔案上傳使用者資料。

如果您使用 AWS CLI 或 AWS SDK,則必須先對使用者資料進行 base64 編碼。然後,在調用 CreateLaunchTemplate 時,將該字串提交為 UserData 參數的值,如 JSON 範本範例所示。

5.    執行下列 AWS CLI 命令,根據在步驟 4 中建立的 mount-efs.json 檔案建立啟動範本:

aws ec2 --region us-east-1 create-launch-template --cli-input-json file://mount-efs.json

**注意:**使用您的 AWS 區域取代 us-east-1

create-launch-template 命令輸出範例

{
  "LaunchTemplate": {
    "LaunchTemplateId": "lt-06935eb650e40f886",
    "LaunchTemplateName": "user-data",
    "CreateTime": "2019-12-26T09:40:46.000Z",
    "CreatedBy": "arn:aws:iam::12345678999:user/alice",
    "DefaultVersionNumber": 1,
    "LatestVersionNumber": 1
  }
}

6.    建立新的運算環境,並將該環境與您的啟動範本建立關聯。

**注意:**當 AWS Batch 啟動執行個體時,Amazon EFS 磁碟區現已掛載到執行個體上。

7.    使用 SSH 連線至由 AWS Batch 啟動的執行個體,檢查 Amazon EFS 磁碟區是否隨著容器執行個體一起掛載。然後,執行下列 Linux df 命令:

$ df -h

df 命令輸出範例

Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        3.9G   92K  3.9G   1% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
/dev/xvda1       50G  854M   49G   2% /
127.0.0.1:/     8.0E     0  8.0E   0% /mnt/efs

**注意:****/mnt/efs ** 會自動掛載。

8.    在 AWS Batch 中建立任務定義,其中包含磁碟區和掛載點。

AWS Batch 任務定義範例

{
  "jobDefinitionName": "userdata",
  "jobDefinitionArn": "arn:aws:batch:us-east-1:12345678999:job-definition/userdata:1",
  "revision": 1,
  "status": "ACTIVE",
  "type": "container",
  "parameters": {},
  "containerProperties": {
    "image": "busybox",
    "vcpus": 1,
    "memory": 1024,
    "command": [],
    "volumes": [
      {
        "host": {
          "sourcePath": "/mnt/efs"
        },
        "name": "efs"
      }
    ],
    "environment": [],
    "mountPoints": [
      {
        "containerPath": "/mnt/efs",
        "sourceVolume": "efs"
      }
    ],
    "ulimits": [],
    "resourceRequirements": []
  }
}

9.    使用在步驟 8 中建立的任務定義提交 AWS Batch 任務


AWS 官方
AWS 官方已更新 1 年前