如何使用 Pulumi 将 EFS 挂载到带有 UserData 的 EC2 实例?

我一直在努力能够在使用 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 脚本根本不运行。我的假设是 EFS ID 在创建 EC2 实例时没有及时解析,但我认为 Pulumi 会自动处理依赖排序,因为 EC2 实例现在依赖于 EFS 卷。我还添加了一个 explicitDependsOn()来查看这是否可能是问题所在,但它没有帮助。


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


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


但也无法让它发挥作用。


qq_笑_17
浏览 119回答 1
1回答

芜湖不芜

我能够弄清楚,问题最终变成了两件事:内联脚本的格式需要没有制表符。pulumi.Sprintf()最终比使用ApplyT().EFS 卷在尝试安装时尚未准备好安装mount -a。放在一起,它现在看起来像这样:instanceArgs := &ec2.InstanceArgs{    // ... arg fields ...}script := `#!/bin/bashexec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1mkdir -p %secho "%s.efs.%s.amazonaws.com:/ %s nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0" >> /etc/fstabEFS_STATUS="unknown"WAIT_TIME=10RETRY_CNT=15while [[ $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]')donewhile 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_TIMEdone`userData := pulumi.Sprintf(script, mountDir, Efs.ID(), region, mountDir, Efs.ID())instanceArgs.UserData = userDataec2, err := ec2.NewInstance(ctx, fmt.Sprintf("%s_instance", name), instanceArgs)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go