无法在 Terraform 中使用 user_data 执行 AWS CLI 命令

Can't execute AWS CLI command with user_data in Terraform

我正在使用 Terraform 启动一个 EC2 实例,我在其中定义了一些 user_data。在 user_data 中,我下载 AWS CLI 并设置配置文件和凭证文件。然后我想从我的 s3 存储桶中获取一个文件。这是我到目前为止写的:

data "template_file" "scripts" {
  template = <<EOF
<powershell>
$dlurl = "installpathtoawscli.msi"
$installerPath = Join-Path $env:TEMP (Split-Path $dlurl -Leaf)
Invoke-WebRequest $dlurl -OutFile $installerPath
Start-Process -FilePath msiexec -Args "/i $installerPath /passive" -Verb RunAs -Wait
mkdir C:\temp
New-Item -Name 'b.bat' -Path 'C:\temp' -Value 'aws s3 cp s3://mybucketname/myfile.extension C:\temp\extension > C:\temp\test.txt'
New-Item -Name 'a.bat' -Path 'C:\Users\Administrator' -Value 'mkdir C:\Users\Administrator\.aws
echo [default]>> C:\Users\Administrator\.aws\credentials
echo aws_access_key_id = MY_ACCESS_KEY>> C:\Users\Administrator\.aws\credentials
echo aws_secret_access_key = MY_SECRET_KEY>> C:\Users\Administrator\.aws\credentials
echo [default]>> C:\Users\Administrator\.aws\config
echo region = MY_REGION>> C:\Users\Administrator\.aws\config
echo output = MY_OUTPUT>> C:\Users\Administrator\.aws\config'
C:\Users\Administrator\a.bat
C:\temp\b.bat
</powershell>
EOF
}

b.bat 被执行并创建了一个 txt 文件,但是它是空的并且没有从 s3 存储桶中抓取任何文件。如果我尝试手动执行它(通过 RDPing 到实例),它会获取文件。知道为什么会这样吗?

经过几天的尝试,我找到了解决方案。

AWS.exe 位置尚未在 PATH 环境中注册。重新启动命令提示符可以解决问题,但是,Terraform 不能这样做,因此解释了为什么当我手动执行它时它会起作用。

我必须提供 AWS.exe 的完整路径才能使其正常工作,例如C:\Program Files\Amazon\AWSCLI\bin\aws.exe 或 C:\Program Files\Amazon\AWSCLIV2\aws.exe 取决于 AWS CLI 的版本。