簡體   English   中英

AWS CDK ec2.Instance userData ....不持久:(

[英]AWS CDK ec2.Instance userData.... not persisting :(

我正在嘗試使用 AWS CDK 啟動一個 ec2 實例,在大多數情況下它運行良好,但我希望 userData 保持不變,以便它在每次啟動時運行......令人討厭的是,這沒有記錄(我能找到的任何地方),我只是無法弄清楚在哪里/如何定義它。 下面是我的代碼,但因為用戶數據是forWindows()我不能只添加xxx.addCommands('<persist>true</persist>')因為 forWindows() 將代碼放在標簽中......

// Instance details
const ssmaUserData = UserData.forWindows()
ssmaUserData.addCommands('mkdir -p C:/helloworld; ');

const ec2Instance = new ec2.Instance(this, 'SdkInstance', {
  vpc,
  instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.NANO),
  machineImage: awsAMI,
  securityGroup: mySecurityGroup,
  vpcSubnets: {subnetType: ec2.SubnetType.PUBLIC},
  keyName: "EC2Connect",
  userData: ssmaUserData
});

我曾嘗試使用ssmaUserData.addOnExitCommands("<persist>true</persist>")及其變體但沒有成功,有人知道如何完成這項工作嗎?

以下是表明這不是持久運行的日志...

2021/03/11 12:56:51Z: Userdata execution begins
2021/03/11 12:56:51Z: Zero or more than one <persist> tag was not provided
2021/03/11 12:56:51Z: Unregistering the persist scheduled task
2021/03/11 12:56:55Z: Zero or more than one <runAsLocalSystem> tag was not provided
2021/03/11 12:56:55Z: Zero or more than one <script> tag was not provided
2021/03/11 12:56:55Z: Zero or more than one <powershellArguments> tag was not provided
2021/03/11 12:56:55Z: <powershell> tag was provided.. running powershell content
2021/03/11 13:08:34Z: Userdata execution begins
2021/03/11 13:08:34Z: Zero or more than one <persist> tag was not provided
2021/03/11 13:08:34Z: Unregistering the persist scheduled task
2021/03/11 13:08:37Z: Zero or more than one <runAsLocalSystem> tag was not provided
2021/03/11 13:08:37Z: Zero or more than one <script> tag was not provided
2021/03/11 13:08:37Z: Zero or more than one <powershellArguments> tag was not provided
2021/03/11 13:08:37Z: <powershell> tag was provided.. running powershell content
2021/03/11 13:08:42Z: Message: The output from user scripts: 

// Instance details
const ssmaUserData = UserData.forWindows()
const userDataScript = '<script>' + '\n' + 'mkdir -p C:/helloworld' + '\n' + '</script>'+ '\n' +'<persist>true</persist>';

const ec2Instance = new ec2.Instance(this, 'SdkInstance', {
  vpc,
  instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.NANO),
  machineImage: awsAMI,
  securityGroup: mySecurityGroup,
  vpcSubnets: {subnetType: ec2.SubnetType.PUBLIC},
  keyName: "EC2Connect",
  userData: Fn.base64(userDataScript)
});

要在每次重啟或啟動實例時運行用戶數據腳本,請將 true 添加到用戶數據。

<script>
echo Current date and time >> %SystemRoot%\Temp\test.log
echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log
</script>
<persist>true</persist>

對於Poweshell

<powershell>
$file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
<persist>true</persist>

用戶數據腳本

addOnExitCommands

向腳本退出時將運行的用戶數據添加一個或多個命令。

我認為<persist>true</persist>是一個標簽而不是一個命令。

提供了標簽:true - 如果找到持久標簽 在每次啟動時運行用戶數據 - 如果找到持久標簽

用戶數據執行

那個沒有骰子:(

當我將其更改為以下內容時,出現 typescript 錯誤

    const userDataScript = '<script>' + '\n' + 'mkdir -p C:/helloworld' + '\n' + '</script>'+ '\n' +'<persist>true</persist>';

    const ec2Instance = new ec2.Instance(this, 'SdkInstance', {
      vpc,
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.NANO),
      machineImage: awsAMI,
      securityGroup: mySecurityGroup,
      vpcSubnets: {subnetType: ec2.SubnetType.PUBLIC},//, onePerAz: true},
      keyName: "EC2Connect",
      userData: cdk.Fn.base64(userDataScript)
    });

錯誤:

Type 'string' is not assignable to type 'UserData | undefined'.ts(2322)
instance.d.ts(143, 14): The expected type comes from property 'userData' which is declared here on type 'InstanceProps'

知道了! 因此,每當我使用 AWS 詳細記錄的UserData.forWindows()時,它都會自動添加<PowerShell>標簽,這意味着如果我定義了<Persist>它將包含標簽......為了解決這個問題,我需要使用UserData.custom()代替。 我已經測試了下面的代碼,它工作得很好!

const script = `
<powershell>
  Start-Transcript -OutputDirectory C:/
  Write-Output HelloWorld
  Stop-Transcript
</powershell>
<persist>true</persist>
`;

const ssmaUserData = UserData.custom(script)

const ec2Instance = new ec2.Instance(this, 'SdkInstance', {
  vpc,
  instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.NANO),
  machineImage: awsAMI,
  securityGroup: mySecurityGroup,
  vpcSubnets: {subnetType: ec2.SubnetType.PUBLIC},
  keyName: "EC2Connect",
  userData: ssmaUserData,
});

為避免將所有腳本寫入字符串,您可以使用提供的方法,特別是如果您想要執行 S3 下載等操作。

完成用戶數據后,只需獲取腳本和 append 標志。

示例(在 python 中,但可以在打字稿中以相同的方式完成):

    instance_userdata = ec2.UserData.for_windows()
    #... do lots os actions like: instance_userdata.add_s3_download_command(...)

    data_script = instance_userdata.render()
    #https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-windows-user-data.html#user-data-execution
    data_script += "<persist>true</persist>"
    persistent_userdata = ec2.UserData.custom(data_script)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM