无法找到凭据--Gitlab Pipeline for S3

时间:2018-04-13 09:46:14

标签: amazon-s3 gitlab gitlab-ci

我正通过Gitlab管道将我网站的前端部署到amazon s3。我以前的部署已成功运行,但最近的部署却没有。这是错误:

Completed 12.3 MiB/20.2 MiB (0 Bytes/s) with 1 file(s) remaining
upload failed: dist/vendor.bundle.js.map to s3://<my-s3-bucket-name>/vendor.bundle.js.map Unable to locate credentials

根据我的秘密变量,我定义了四个。它们是两个不同存储桶的S3凭证变量(AWS_ACCESS_KEY_ID & AWS_SECRET_ACCESS_KEY)。一对用于测试分支,另一对用于生产分支。

不是 - 生产环境变量是受保护的而其他变量则不是。 这是我运行的部署脚本:

#/bin/bash
#upload files
aws s3 cp ./dist s3://my-url-$1 --recursive --acl public-read

那么为什么我会收到此凭据位置错误?当然它应该自动获取环境变量(未受保护的变量)并部署它们。我是否需要在作业中定义变量并参考它们?

3 个答案:

答案 0 :(得分:4)

(我多次遇到此问题-为其他有相同错误的人添加另一个答案-其他原因)。

快速清单。

转到设置-> CI / CD->变量并检查:

  1. 如果同时存在AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY环境变量。
  2. 如果两个名字拼写正确。
  3. 如果它们的状态定义为protected-它们只能针对protected个分支(例如master)运行。

如果仍然发生错误:

  1. 确保访问密钥仍然存在并且在您的帐户中处于活动状态。
  2. 删除当前环境变量,并用新生成的访问密钥替换它们,并确保AWS_SECRET_ACCESS_KEY不包含任何特殊字符(可能导致奇怪的错误)。

答案 1 :(得分:1)

实际的问题是命名变量时发生冲突。对于这两个分支,变量分别称为AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY。但是问题不仅仅在于重命名它们,因为管道仍然没有选择它们。

我将密码打印到日志中,以确定哪个密码被哪个分支使用,但发现两个密码都未被使用。解决方案是为每个分支的每个密码(例如PRODUCTION_ACCESS_KEY_IDTESTING_ACCESS_KEY_ID)使用唯一的名称,并在构建脚本中引用它们:

deploy_app_production:
  environment: 
    name: production
    url: http://modius-life-portal-ui-production.s3-website.eu-west-1.amazonaws.com/
  before_script:
    - echo "Installing ruby & dpl"
    - apt-get update && apt-get install -y ruby-full
    - gem install dpl
  stage: deploy
  tags:
    - nv1
  script:
    - echo "Deploying to production"
    - sh deploy.sh production $PRODUCTION_ACCESS_KEY_ID $PRODUCTION_SECRET_ACCESS_KEY
  only:
    - master

deploy.sh中,我提到了传入的变量(尽管最终我确实切换到了dpl):

dpl --provider=s3 --access-key-id=$2 --secret-access-key=$3 --bucket=<my-bucket-name>-$1 --region=eu-west-1 --acl=public_read --local-dir=./dist --skip_cleanup=true

答案 2 :(得分:0)

您是否尝试过以交互方式在本地运行GitLab管道脚本中使用的Docker映像?

这样,您可以验证没有拾取环境变量确实是问题所在。 (即,如果您在本地设置相同的环境变量,并且可以正常工作,那么是的,这就是问题所在。)

我怀疑凭证可以很好地被拾取,也许它们只是不具有执行请求的操作所需的所有权限。我知道该错误消息另有说明,但是在涉及权限问题时,S3错误消息往往会产生误导。