【问题标题】:How to Mount EFS to EC2 Instance with UserData using Pulumi?如何使用 Pulumi 使用 UserData 将 EFS 挂载到 EC2 实例?
【发布时间】:2022-11-10 21:57:43
【问题描述】:

我一直在努力在使用 UserData 字段创建时将 EFS 卷安装到 EC2 实例。我正在使用 Pulumi 的 Go 库,我拥有的内容如下所示:


// ... EFS with proper security groups and mountTarget created above ...

dir := configuration.Deployment.Efs.MountPoint
availabilityZone := configuration.Deployment.AvailabilityZone
region := configuration.Deployment.Region

userdata := args.Efs.ID().ToStringOutput().ApplyT(func(id string) (string, error) {
    script := `
            #!/bin/bash -xe
            exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1

            mkdir -p %s
            echo "%s.%s.%s.amazonaws.com:/ %s nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0" | tee -a /etc/fstab
            mount -a
            `
    return fmt.Sprintf(script, dir, availabilityZone, id, region, dir), nil
}).(pulumi.StringOutput)


ec2, err := ec2.NewInstance(ctx, fmt.Sprintf("%s_instance", name), &ec2.InstanceArgs{
    // ... (other fields) ...
    UserData: userdata,
    // ... (other fields) ...
})

但是当我用 Pulumi 创建所有资源时,UserData 脚本根本没有运行。我的假设是在创建 EC2 实例时 EFS ID 没有及时解析,但我认为 Pulumi 会自动处理依赖关系排序,因为 EC2 实例现在依赖于 EFS 卷。我还添加了一个明确的DependsOn() 以查看这是否可能是问题所在,但这并没有帮助。

有什么我做错了吗?任何帮助将不胜感激,谢谢!

我已经尝试了上述示例的几种变体。我看了这个例子:Pulumi - EFS Id output to EC2 LaunchConfiguration UserData

但也无法让它发挥作用。

【问题讨论】:

  • 您的 cloud-init 日志中是否有错误?
  • 我不确定,我没有直接使用 cloud-init 做任何事情。 Pulumi 在后端使用 cloud-init 吗?我在哪里可以找到这方面的日志?
  • Cloud-init 负责处理用户数据并执行用户数据脚本。它在启动时从您的 ec2 实例运行。相关日志为 /var/log/cloud-init.log。此处的文档:cloudinit.readthedocs.io/en/latest
  • 谢谢您的帮助!我最终找出了问题所在,我在下面发布了解决方案。

标签: amazon-web-services go amazon-ec2 amazon-efs pulumi


【解决方案1】:

我能够弄清楚,问题最终是几件事:

  1. 内联脚本的格式需要没有制表符。
  2. pulumi.Sprintf() 最终比使用 ApplyT() 工作得更好。
  3. EFS 卷在尝试执行 mount -a 时尚未准备好挂载。

    放在一起,它现在看起来像这样:

    instanceArgs := &ec2.InstanceArgs{
        // ... arg fields ...
    }
    script := `#!/bin/bash
    exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
    mkdir -p %s
    echo "%s.efs.%s.amazonaws.com:/ %s nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0" >> /etc/fstab
    EFS_STATUS="unknown"
    WAIT_TIME=10
    RETRY_CNT=15
    while [[ $EFS_STATUS != ""available"" ]]; do
      echo "Waiting for EFS to start..."
      sleep $WAIT_TIME
      EFS_STATUS=$(aws efs describe-file-systems | jq '.FileSystems | map(select(.FileSystemId == "%s")) |  map(.LifeCycleState) | .[0]')
    done
    while true; do
      mount -a -t nfs4
      if [ $? = 0 ]; then
        echo "Successfully mounted EFS to instance."
        break
      fi;
      if [ $RETRY_CNT -lt 1 ]; then
        echo "EFS could not mount after $RETRY_CNT retries."
      fi;
      echo "EFS could not mount, retrying..."
      ((RETRY_CNT--))
      sleep $WAIT_TIME
    done`
    
    userData := pulumi.Sprintf(script, mountDir, Efs.ID(), region, mountDir, Efs.ID())
    instanceArgs.UserData = userData
    
    ec2, err := ec2.NewInstance(ctx, fmt.Sprintf("%s_instance", name), instanceArgs)
    
    

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2019-03-31
    • 1970-01-01
    • 2018-07-20
    • 2017-04-25
    • 2020-01-29
    • 2017-09-13
    • 2018-03-25
    • 2017-07-11
    相关资源
    最近更新 更多