亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 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 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號