Amazon web services 运行脚本将文件上传到AWS S3是可行的,但通过jenkins job运行相同的脚本不会';行不通

Amazon web services 运行脚本将文件上传到AWS S3是可行的,但通过jenkins job运行相同的脚本不会';行不通,amazon-web-services,docker,jenkins,amazon-s3,ssh,Amazon Web Services,Docker,Jenkins,Amazon S3,Ssh,简单的目标: 我想有两个容器都在我的本地机器上运行。一个jenkinscontainer和一个SSH服务器container。然后,jenkins作业可以连接到SSH服务器容器并执行aws命令将文件上载到S3 我的工作区目录结构: adocker compose.yml(详情见下文) 名为centos/的目录 在centos/内部,我有一个Dockerfile用于构建SSH服务器映像 docker compose.yml: 在我的docker compose.yml中,我声明了两个容器(服务

简单的目标:

我想有两个容器都在我的本地机器上运行。一个
jenkins
container和一个
SSH服务器
container。然后,jenkins作业可以连接到SSH服务器容器并执行aws命令将文件上载到S3

我的工作区目录结构:

  • a
    docker compose.yml
    (详情见下文)
  • 名为
    centos/
    的目录
  • centos/
    内部,我有一个
    Dockerfile
    用于构建SSH服务器映像
docker compose.yml:

在我的
docker compose.yml
中,我声明了两个容器(服务)

  • 一个jenkins容器,名称
    jenkins
  • 一个SSH服务器contaienr,名为
    remote\u host
远程\u主机的
Dockerfile
如下所示(请注意上次运行的
安装了AWS CLI):

上述设置的当前情况:

我运行
docker compose build
docker compose up
jenkins
容器和
remote_host
(SSH服务器)容器都已成功启动并运行

我可以通过以下方式进入
jenkins
集装箱:

$ docker exec -it jenkins bash
jenkins@7551f2fa441d:/$ 
我可以通过以下方式成功ssh到
远程\u主机
容器:

jenkins@7551f2fa441d:/$ ssh -i /tmp/remote-key remote_user@remote_host
Warning: the ECDSA host key for 'remote_host' differs from the key for the IP address '172.19.0.2'
Offending key for IP in /var/jenkins_home/.ssh/known_hosts:1
Matching host key in /var/jenkins_home/.ssh/known_hosts:2
Are you sure you want to continue connecting (yes/no)? yes
[remote_user@8c203bbdcf72 ~]$ 
远程\u主机
容器中,我还在
~.AWS/credentials
下配置了我的AWS访问密钥和密钥:

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
我可以成功运行aws命令,将文件从
远程主机
容器上载到我的aws S3存储桶。比如:

[remote_user@8c203bbdcf72 ~]$ aws s3 cp myfile s3://mybucket123asx/myfile
问题是什么

现在,我想让我的jenkins作业执行aws命令将文件上载到S3。因此,我在我的
远程\u主机
容器中创建了一个shell脚本,脚本如下:

#/bin/bash
BUCKET_NAME=$1
aws s3 cp /tmp/myfile s3://$BUCKET_NAME/myfile
在我的jenkins中,我已经配置了SSH&在我的jenkins作业配置中,我已经:

如您所见,它只运行位于
remote\u host
容器中的脚本

当我构建jenkins作业时,我总是在控制台中得到错误:
上载失败:../../tmp/myfile到s3://mybucket123asx/myfile无法找到凭据

为什么相同的s3命令在
远程\u主机
容器中执行时起作用,但从jenkins作业运行时不起作用

我还尝试在脚本中显式导出aws密钥id和secret密钥。(请记住,我在
remote\u host
中配置了
~.aws/credentials
,它在不显式导出aws密钥的情况下工作)


好的,我通过将
export
语句更改为大写字母解决了我的问题。因此,问题的原因是当jenkins运行脚本时,它在
remote\u host
上以
remote\u user
的身份运行。虽然在
远程\u主机上
我有
~/.aws/credentials
设置,但该文件仅对
根用户以外的用户具有读取权限

[root@8c203bbdcf72 /]# ls -l ~/.aws/
total 4
-rw-r--r-- 1 root root 112 Sep 25 19:14 credentials
这就是为什么jenkins运行脚本将文件上载到S3时,无法找到凭据的原因。因为远程用户无法读取凭据文件。因此,我仍然必须取消注释导出aws密钥id和密钥的行@Marcin的评论很有帮助,字母必须是大写字母,否则就行不通

因此,总的来说,我解决问题的方法是使用以下内容更新我的脚本:

export aws_access_key_id=AKAARXL1CFQNN4UV5TIO
export aws_secret_access_key=MY_SECRETE_KEY

对于最后一个示例,导出应该使用如图所示的大写字母。对于jenkins,脚本可能不运行
remote\u user
user。在您的脚本中,是否可以添加
whoami
并确认执行脚本的用户?很可能是用户问题,如Marcin所述。顺便说一下,您的脚本在顶行缺少一个感叹号:它应该是
#/bin/bash
。这当然不是上传问题的根源。我尝试了@Marcin的建议,
whoami
显示jenkins以
remote\u用户的身份运行脚本
#/bin/bash
BUCKET_NAME=$1
export aws_access_key_id=AKAARXL1CFQNN4UV5TIO
export aws_secret_access_key=MY_SECRETE_KEY
aws s3 cp /tmp/myfile s3://$BUCKET_NAME/myfile
[root@8c203bbdcf72 /]# ls -l ~/.aws/
total 4
-rw-r--r-- 1 root root 112 Sep 25 19:14 credentials
export aws_access_key_id=AKAARXL1CFQNN4UV5TIO
export aws_secret_access_key=MY_SECRETE_KEY