aws s3 ls:HTTP 客户端引发未处理的异常:标头值无效

问题描述 投票:0回答:3

我正在尝试实现一个使用 Gitlab CI 将 Python 代码打包并复制到 S3 的管道。 这是导致问题的工作:

package:
  stage: package
  image: python:3.8
  script:
    - apt-get update && apt-get install -y zip unzip jq
    - pip3 install awscli 
    - aws s3 ls
    - ./cicd/scripts/copy_zip_to_s3.sh
  only:
    refs:
      - developer

我想提一下,在 .gitlab-ci.yml 中的 before_script 部分中,我已经从 Gitlab 环境变量导出了 AWS 凭证(AWS SECRET ACCESS KEY、AWS_ACCESS_KEY_ID 等)。 我已经检查了数千次我的凭据,它们完全正确。我还想提一下,相同的脚本非常适合 Gitlab 中同一组下的另一个项目。 这是错误:

$ aws s3 ls
An HTTP Client raised an unhandled exception: Invalid header value b'AWS4-HMAC-SHA256 Credential=AKIAZXXXXXXXXXX\n/2020XX2/us-east-1/sts/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=ab53XX6eb72XXXXXX2152e4XXXX93b104XXXXXXX363b1da6f9XXXXX'
ERROR: Job failed: exit code 1

./cicd/scripts/copy_zip_to_s3.sh 进行打包和复制,执行时会发生同样的错误,这就是为什么我添加了一个简单的 aws 命令 aws s3 ls 以表明即使是简单的 'ls' 也不是工作。

请问有什么解决办法吗?提前谢谢大家。

amazon-web-services gitlab-ci
3个回答
19
投票

这是因为向 AWS ACCESS KEY 变量添加了额外的行。


1
投票

我在 Windows 中的 Cygwin 上运行 bash 脚本时遇到了类似的问题。修复方法是删除 从我放入环境变量的值的末尾开始。

如果有人感兴趣的话,这是我的整个脚本。它承担一个新的 AWS 角色,将这些信用设置到环境变量中,然后打开一个新的 bash shell,它将尊重这些设置的变量。

#!/bin/bash

hash aws 2>/dev/null
if [ $? -ne 0 ]; then
    echo >&2 "'aws' command line tool required, but not installed. Aborting.";
    exit 1;
fi;

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN
ROLEID=123918273981723
TARGETARN="arn:aws:iam::${ROLEID}:role/OrganizationAccountAccessRole"

COMMAND="aws sts assume-role --role-arn $TARGETARN --role-session-name damien_was_here"

RESULT=$($COMMAND) 

#对 tr -d 的调用 是这个问题的重要部分。

AccessKeyId=$(echo -n "$RESULT" | jq -r '.Credentials.AccessKeyId' | tr -d '\r\n')
SecretAcessKey=$(echo -n "$RESULT" | jq -r '.Credentials.SecretAccessKey' | tr -d '\r\n')
SessionToken=$(echo -n "$RESULT" | jq -r '.Credentials.SessionToken' | tr -d '\r\n')

export AWS_ACCESS_KEY_ID=$AccessKeyId
export AWS_SECRET_ACCESS_KEY=$SecretAcessKey
export AWS_SESSION_TOKEN=$SessionToken

echo Running a new bash shell with the environment variable set. 
bash

0
投票

就我而言,这是一个附加字符' ' 在 AWS_ACCESS_KEY_ID 的 Base64 编码期间由“echo”命令创建。

为了修复此问题,请使用“-n”参数和“echo”命令,例如

$ echo -n AKIAJGN2PSI2F5OHJSQQ | base64
QUtJQUpHTjJQU0kyRjVPSEpTUVE=
© www.soinside.com 2019 - 2024. All rights reserved.