使用可复用工作流时Github Actions Docker无法获取凭证
在被调用的GitHub Actions工作流中,使用aws-actions/configure-aws-credentials动作配置AWS凭证,再通过docker/login-action登录ECR时,抛出错误:
Error: Could not load credentials from any providers
相同逻辑在调用方工作流中可正常运行,怀疑问题与环境变量存储方式有关,第二个AWS凭证动作用于承担ECR仓库所在的角色。
调用方工作流代码:
jobs: build_and_deploy: uses: <Owner>/<repo>/.github/workflows/called_workflow.yml@master secrets: inherit with: environment: dev aws_account_number: 123456789123 aws_region: us-east-1 docker_image_name: thisisanimage aws_profile_name: bestprofile aws_role_arn: arn:aws:iam::<account>:role/<rolename>
被调用工作流代码:
jobs: build-and-push: runs-on: ubuntu-latest environment: ${{ inputs.environment }} - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v2 with: aws-region: <region> role-to-assume: arn:aws:iam::<account1>:role/<assumedrole1> role-skip-session-tagging: true role-duration-seconds: 1200 mask-aws-account-id: false - name: Configure other AWS Credentials uses: aws-actions/configure-aws-credentials@v2 with: aws-region: <region> role-to-assume: arn:aws:iam::<account2>:role/<assumedrole2> role-skip-session-tagging: true role-duration-seconds: 1200 mask-aws-account-id: false role-chaining: true - name: Login to Docker uses: docker/login-action@v2 with: registry: <account2>.dkr.ecr.<region>.amazonaws.com/<repository>
检查输入参数的正确引用
被调用工作流中的<region>、<account1>、<account2>等占位符,必须替换为调用方传入的inputs变量(例如${{ inputs.aws_region }}、${{ inputs.aws_account_number }})。如果直接保留占位符,会导致凭证配置时没有有效的AWS账号和区域信息,进而引发登录失败。同时确认调用方传入的aws_role_arn是否在被调用工作流中正确引用,角色ARN是否匹配目标账号。验证角色链的权限配置
第二个configure-aws-credentials动作启用了role-chaining: true,需确保第一个角色(的assumedrole1)的信任策略允许其扮演第二个角色( 的assumedrole2);同时第二个角色的权限策略必须包含 ecr:GetAuthorizationToken(ECR登录必备权限),以及其他必要的ECR操作权限(如ecr:BatchCheckLayerAvailability、ecr:PutImage等)。确认环境变量的存在与覆盖
aws-actions/configure-aws-credentials会设置AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN三个核心环境变量。可在docker/login-action前添加调试步骤,打印变量是否存在(例如run: echo "AWS_ACCESS_KEY_ID starts with: ${AWS_ACCESS_KEY_ID:0:4}"),确认第二个凭证动作是否正确覆盖了这些变量,且在登录步骤执行时变量未丢失。检查工作流环境的权限设置
被调用工作流指定了environment: ${{ inputs.environment }},需确认该环境是否允许继承调用方传入的secrets,以及被调用工作流所在仓库是否有额外的权限限制,导致AWS相关secrets无法正常传递。验证动作版本兼容性
当前使用的aws-actions/configure-aws-credentials@v2和docker/login-action@v2版本可能存在兼容性问题,或在被调用工作流场景下有已知bug。尝试升级到最新稳定版本(如aws-actions/configure-aws-credentials@v4、docker/login-action@v3),观察问题是否解决。检查角色会话有效期
两个角色的会话时长均设置为1200秒(20分钟),如果工作流执行时间过长,可能导致会话过期。可适当延长有效期(最长支持3600秒),或检查步骤执行时间是否超过了会话时长限制。
内容的提问来源于stack exchange,提问作者ChrisP

