0

У меня есть этот UserData в configurationConfig ресурс в моем шаблоне CloudFormation:Не удается установить EFS в экземпляре ECS

"UserData":{ "Fn::Base64" : { 
      "Fn::Join" : ["", [ 
       "#!/bin/bash -xv\n", 
       "yum -y update\n", 
       "yum -y install aws-cfn-bootstrap\n", 
       "yum -y install awslogs jq\n", 
       "#Install NFS client\n", 
       "yum -y install nfs-utils\n", 
       "#Install pip\n", 
       "yum -y install python27 python27-pip\n", 
       "#Install awscli\n", 
       "pip install awscli\n", 
       "#Upgrade to the latest version of the awscli\n", 
       "#pip install --upgrade awscli\n", 
       "#Add support for EFS to the CLI configuration\n", 
       "aws configure set preview.efs true\n", 
       "#Get region of EC2 from instance metadata\n", 
       "EC2_AVAIL_ZONE=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`\n", 
       "EC2_REGION=",{ "Ref": "AWS::Region"} ,"\n", 
       "mkdir /efs-tmp/\n", 
       "chown -R ec2-user:ec2-user /efs-tmp/\n", 
       "DIR_SRC=$EC2_AVAIL_ZONE.",{ "Fn::FindInMap" : [ "FileSystemMap", {"Ref" : "EnvParam"}, "FileSystemID"] },".efs.$EC2_REGION.amazonaws.com\n", 
       "DIR_TGT=/efs-tmp/\n", 
       "touch /home/ec2-user/echo.res\n", 
       "echo ",{ "Fn::FindInMap" : [ "FileSystemMap", {"Ref" : "EnvParam"}, "FileSystemID"] }," >> /home/ec2-user/echo.res\n", 
       "echo $EC2_AVAIL_ZONE >> /home/ec2-user/echo.res\n", 
       "echo $EC2_REGION >> /home/ec2-user/echo.res\n", 
       "echo $DIR_SRC >> /home/ec2-user/echo.res\n", 
       "echo $DIR_TGT >> /home/ec2-user/echo.res\n", 
       "#Mount EFS file system\n", 
       "mount -t nfs4 -o vers=4.1 $DIR_SRC:/ $DIR_TGT >> /home/ec2-user/echo.res\n", 
       "#Backup fstab\n", 
       "cp -p /etc/fstab /etc/fstab.back-$(date +%F)\n", 
       "echo -e \"$DIR_SRC:/ $DIR_TGT nfs4 nfsvers=4.1 0 0 | tee -a /etc/fstab\n", 
         "docker ps\n", 
       "service docker stop\n", 
       "service docker start\n", 
       "/opt/aws/bin/cfn-init -v", 
       "   --stack ", { "Ref": "AWS::StackName" }, 
       "   --resource ContainerInstances", 
       "   --region ", { "Ref" : "AWS::Region" },"\n", 
       "service awslogs start\n", 
       "chkconfig awslogs on\n" 
      ]]} 

Вот группа безопасности контейнера ECS:

"EcsSecurityGroup":{ 
    "Type" : "AWS::EC2::SecurityGroup", 
    "Properties" : { 
     "GroupDescription" : "ECS SecurityGroup", 
     "SecurityGroupIngress" : [ 
     { 
      "IpProtocol" : "tcp", 
      "FromPort" : "2049", 
      "ToPort" : "2049", 
      "CidrIp" : {"Ref" : "CIDRVPC"} 
     }, 
     { 
      "IpProtocol" : "tcp", 
      "FromPort" : "22", 
      "ToPort" : "22", 
      "CidrIp" : "0.0.0.0/0" 
     } 
     ], 
     "SecurityGroupEgress" : [ 
     { 
      "IpProtocol" : "-1", 
      "FromPort" : "-1", 
      "ToPort" : "-1", 
      "CidrIp" : "0.0.0.0/0" 
     } 
     ], 
     "VpcId":{ "Ref":"VpcId" } 
    } 
    }, 

После запустив шаблон, я ssh в экземпляр, дождался userdata, чтобы закончить выполнение, затем я нашел в /var/log/cloud-init-ouptut.log эту ошибку:

mount.nfs4: Connection timed out 

Кроме того, файл /etc/fstab не содержит линию монтирования. И я не могу получить доступ к Файловой системе, потому что созданная папка для EFS пуста.

Пожалуйста, скажите мне, где эта проблема?

ответ

1

Убедитесь, что вы создали группу безопасности EFS и позволяют вашей безопасности EC2 в правилах проникающих:

"EfsSecurityGroup": { 
     "Properties": { 
      "GroupDescription": "EFS security group", 
      "SecurityGroupIngress": [ 
       { 
        "FromPort": 2049, 
        "IpProtocol": "tcp", 
        "SourceSecurityGroupId": { 
         "Ref": "YOUR_EC2_SECURITY_GROUP" 
        }, 
        "ToPort": 2049 
       }, 
      ], 
      "Tags": [ 
       { 
        "Key": "Application", 
        "Value": { 
         "Ref": "AWS::StackName" 
        } 
       }, 
       { 
        "Key": "Name", 
        "Value": "efs-sg" 
       } 
      ], 
      "VpcId": { 
       "Ref": "YOUR_VPC_ID" 
      } 
     }, 
     "Type": "AWS::EC2::SecurityGroup" 
    } 

Обеспечение EFS mountarget существует:

"EFSMountTargetYourAZ": { 
     "Properties": { 
      "FileSystemId": "EFS_id", 
      "SecurityGroups": [ 
       { 
        "Ref": "EFS_SECURITY_GROUP" 
       } 
      ], 
      "SubnetId": { 
       "Ref": "SUBNET_ID" 
      } 
     }, 
     "Type": "AWS::EFS::MountTarget" 
    }, 
+0

В вашей группе безопасности EC2, вы не должны есть правило входа для порта 2049, которое для EFS, вы должны создать группу безопасности efs и разрешить вашу безопасность ec2 как 'SourceSecurityGroupId' на этом порту 2049. – Gigapalmer

1
  1. Там опечатка (отсутствует закрытие \") в этой строке в вашем скрипте, который вызывает попытку записи в /etc/fstab на провал:

    echo -e \"$DIR_SRC:/ $DIR_TGT nfs4 nfsvers=4.1 0 0 | tee -a /etc/fstab\n", 
    

    Это следует читать:

    echo -e \"$DIR_SRC:/ $DIR_TGT nfs4 nfsvers=4.1 0 0\" | tee -a /etc/fstab\n", 
    
  2. Вы должны убедиться, что ресурс AWS::EFS::MountTarget существует в указанной зоне доступности. В противном случае попытка подключения файловой системы с использованием имени DNS не удастся правильно решить. См. Mounting File Systems и AWS::EFS::FileSystem для дальнейшей документации.

Смежные вопросы