我的目标是启动一个实例,以便在启动时触发启动脚本以下载存储在 AWS S3 中的一些配置文件。因此,在启动脚本中,我正在设置 S3 存储桶详细信息,然后触发aws s3 sync
执行实际下载的config.sh
。但是,aws
命令不起作用 - 找不到执行命令。
用户数据
启动 EC2 实例时,我有以下用户数据:
#!/bin/bash
# Set command from https://stackoverflow.com/a/34206311/919480
set -e -x
export S3_PREFIX='bucket-name/folder-name'
/home/ubuntu/app/sh/config.sh
AWS CLI 是随文档中所述pip
一起安装的。
观察
我认为,用户数据脚本是使用root
用户 ID 运行的。这就是为什么在我/home/ubuntu/
的用户数据中,$HOME
没有解析为/home/ubuntu/
。事实上,config.sh
中的第一个命令是mkdir /home/ubuntu/csv
它创建一个目录,所有者为root
!
那么,得出用户数据在root
用户ID下运行的结论是否正确?
分辨率
我应该使用 REST API 下载吗?
作为用户数据输入的脚本以root 用户身份执行,因此不要在脚本中使用 sudo 命令。
请参阅: 启动时在 Linux 实例上运行命令
一种解决方案是在执行 AWS CLI 之前将PATH
env 变量设置为包含 AWS CLI(并添加任何其他必需的路径(。
解决方案
鉴于 AWS CLI 是在没有sudo pip
的情况下安装的,CLI 不适用于根。因此,为了与ubuntu
用户一起运行,我使用了以下用户数据脚本:
#!/bin/bash
su ubuntu -c '$HOME/app/sh/config.sh default`
在config.sh
中,参数default
用于在调用CLI之前构建完整的S3 URI。但是,尽管可以通过正常登录访问aws
,但调用仅在完整路径$HOME/.local/bin/aws
下成功。