为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
qq_笑_17 2023-03-15 13:47:17
我一直在努力能够在使用 UserData 字段创建时将 EFS 卷安装到 EC2 实例。我正在使用 Pulumi 的 Go 库,我拥有的内容如下所示:// ... EFS with proper security groups and mountTarget created above ...dir := configuration.Deployment.Efs.MountPointavailabilityZone := configuration.Deployment.AvailabilityZoneregion := configuration.Deployment.Regionuserdata := 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但也无法让它发挥作用。
查看完整描述

1 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

我能够弄清楚,问题最终变成了两件事:

  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)


查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信