解决 GitLab Runner 无法在当前 AWS 账户中获取 AWS ECR 镜像的问题

82次阅读
没有评论

问题描述

在使用 GitLab 和 GitLab Runner 时遇到了问题。他们在同一台主机上运行 GitLab 和 GitLab Runner,并且主机上的 EC2 实例附加了一个 IAM 角色,该 IAM 角色允许执行一些跨多个 AWS 账户的 ECR 操作。Runners 使用 docker 作为执行器,并且能够完美地扮演角色以推送和拉取镜像。然而,如果需要拉取/推送到运行 GitLab 的帐户中,就会出现问题。他们首先需要在 GitLab 主机上拉取镜像,以便在 Runners 中访问这些镜像。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1 – 使用 AWS ECR 凭证助手

一种解决方法是使用 Amazon 的 ECR 凭证助手来处理 GitLab Runner 与 AWS ECR 的认证。以下是在 GitLab CI/CD 中使用的脚本示例:

在你的 gitlab-ci.yml 文件中,添加以下内容:

image: docker:19.03

services:
  - docker:19.03.0-dind

before_script:
  - $(aws ecr get-login --no-include-email --region <your_region>)

# ... 接下来的任务和步骤

确保在 GitLab 项目的 Settings/CI-CD 部分中设置了 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 变量。此外,确保你指定的地区 (<your_region>) 与你登录的地区相同,以便能够访问正确的 ECR 镜像。

方案2 – 使用自定义脚本

如果你想更精细地控制 GitLab Runner 与 AWS ECR 的交互,你可以使用自定义脚本来管理这个过程。以下是一个启动私有 GitLab Runner 并配置其访问 AWS ECR 的脚本示例:

#!/bin/bash
set -e

# 更新系统并安装必要的工具
apt update -y && apt install awscli make -y

# 下载并安装 GitLab Runner
curl -LJO https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb
dpkg -i gitlab-runner_amd64.deb

# 配置 GitLab Runner
sed -i -e '/volumes/s/\["\/cache\"]/\["\/cache","\/var\/run\/docker.sock:\/var\/run\/docker.sock"]/' /etc/gitlab-runner/config.toml

# 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && usermod -aG docker gitlab-runner

# 注册 GitLab Runner
gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.com/" \
  --registration-token "${GITLAB_RUNNER_TOKEN}" \
  --executor "docker" \
  --docker-image "docker:latest" \
  --description "gitlab-runner" \
  --tag-list "gitlab,runner,aws" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"

# 配置 AWS 环境变量
echo -e "export AWS_SDK_LOAD_CONFIG=true \nexport AWS_REGION=${AWS_REGION}" >> ~/.bashrc
source ~/.bashrc

# 配置 Docker 凭证助手
mkdir ~/.docker
cat <<EOF >>~/.docker/config.json
{
  "credsStore": "ecr-login"
}
EOF

# 下载并安装 Amazon ECR 凭证助手
git clone https://github.com/awslabs/amazon-ecr-credential-helper.git
cd amazon-ecr-credential-helper/ && make docker
cp bin/local/docker-credential-ecr-login /usr/local/bin

# 重启 Docker 服务和 GitLab Runner
systemctl restart docker && gitlab-runner restart

# 输出 ECR 登录凭证列表
export AWS_REGION=${AWS_REGION} && docker-credential-ecr-login list

在上面的示例中,我们首先更新系统并安装所需的工具,然后下载和安装 GitLab Runner。接着,我们配置了 GitLab Runner 的基本设置,安装了 Docker,并注册了 GitLab Runner。随后,我们配置了 AWS 环境变量,设置了 Docker 凭证助手,安装了 Amazon ECR 凭证助手,并重启了 Docker 和 GitLab Runner。最后,我们输出了 ECR 登录凭证列表。

总结

通过使用 AWS ECR 凭证助手或自定义脚本,你可以解决 GitLab Runner 无法从当前 AWS 账户中拉取 AWS ECR 镜像的问题。这将确保 Runner 能够正确地与 ECR 交互,并顺利地完成你的 CI/CD 流程。

正文完