Comment monter un volume Amazon EFS dans AWS Batch au sein d'un environnement de calcul géré ?

Dernière mise à jour : 12/06/2020

Je souhaite monter un volume Amazon Elastic File System (Amazon EFS) dans AWS Batch.

Brève description

Vous pouvez utiliser un modèle de lancement pour monter un volume Amazon EFS sur vos conteneurs, via AWS Batch, sans créer d'Amazon Machine Images (AMI) personnalisées.

Important : lorsque vous créez un volume Amazon EFS, utilisez le même VPC Amazon Virtual Private Cloud et les mêmes sous-réseaux que ceux attribués à votre environnement de calcul.

Solution

1.    Créez un système de fichiers Amazon EFS.

2.    Prenez note de l'ID de votre système de fichiers (par exemple, fs-12345678).

3.    Dans votre modèle de lancement, créez une section dédiée aux données utilisateur au format MIME. Pour plus d'informations, consultez la section Archive Mime en plusieurs parties du site Web Cloud-init.

L'exemple de fichier en plusieurs parties MIME suivant permet de configurer la ressource de calcul afin d'installer le package amazon-efs-utils, ainsi que de monter un système de fichiers Amazon EFS existant à l'adresse /mnt/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==--

Remarque : remplacez fs-12345678 par l'ID de votre système de fichiers.

4.    Lancez le modèle pour appeler les données utilisateur, puis créez un fichier nommé mount-efs.json. Reportez-vous aux exemples suivants.

Remarque : ajustez la taille de votre volume en fonction de vos besoins.

Exemple de modèle de lancement basé sur Amazon Linux 2 :

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

Exemple de modèle de lancement basé sur 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=="
}
}

Remarque : si vous ajoutez des données utilisateur à un modèle de lancement dans la console Amazon Elastic Compute Cloud (Amazon EC2), collez-les sous forme de texte brut, ou chargez-les à partir d'un fichier. Si vous utilisez l'interface de ligne de commande AWS (AWS CLI) ou un kit SDK AWS, vous devez d'abord encoder les données utilisateur en base64. Ensuite, soumettez cette chaîne en tant que valeur du paramètre UserData lorsque vous appelez CreateLaunchTemplate comme on le voit dans le modèle JSON précédent :

5.    Créez un modèle de lancement basé sur le fichier mount-efs.json que vous avez créé à l'étape 4.

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

Remarque : remplacez us-east-1 par votre région AWS.

Le résultat ressemble à ce qui suit :

{
    "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.    Créez un nouvel environnement de calcul et associez-le à votre modèle de lancement.

Désormais, le volume Amazon EFS est monté sur les instances chaque fois qu'AWS Batch met en service des instances.

7.    Pour vérifier si le volume Amazon EFS est monté avec l'instance de conteneur, utilisez SSH pour vous connecter à l'instance lancée par AWS Batch, puis exécutez la commande suivante :

$ df -h

Le résultat ressemble à ce qui suit :

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

Remarque : /mnt/efs est monté automatiquement.

8.    Créez une définition de tâche qui inclut le volume et le point de montage. Reportez-vous à l'exemple suivant :

{
    "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.    Soumettez une tâche AWS Batch à l'aide de la définition de tâche à l'étape 8.


Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?