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

问题描述

我正在使用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的版本。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...