Github 操作配置 AWS 凭证错误:请求中包含的安全令牌无效

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

我正在尝试设置一个 Github Actions 工作流程,自动从我的存储库构建 docker 映像并将其推送到 Amazon ECR。

这是我的 aws.yml 代码,它基于 github 的本教程这里

name: Deploy to Amazon ECS

on:
  push:
    branches: [ "main" ]

env:
  AWS_REGION: ap-southeast-2                   # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: z-coord-repo/api-service           # set this to your Amazon ECR repository name
  ECS_SERVICE: z-coord                 # set this to your Amazon ECS service name
  ECS_CLUSTER: z-coord-cluster                 # set this to your Amazon ECS cluster name
  ECS_TASK_DEFINITION: .aws/task-definition.json  # set this to the path to your Amazon ECS task definition
                                               # file, e.g. .aws/task-definition.json

permissions:
  contents: read

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
    - name: Checkout
      uses: actions/checkout@v4

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v4
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}

    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1

    - name: Build, tag, and push image to Amazon ECR
      id: build-image
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        IMAGE_TAG: ${{ github.sha }}
      working-directory: ./api-service
      run: |
        # Build a docker container and
        # push it to ECR so that it can
        # be deployed to ECS.
        docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
        echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT

但是,此工作流程不断失败,给出错误

The security token included in the request is invalid.
。经过一番谷歌搜索后,我了解到解决方法是将 IAM 会话令牌作为机密包含在内,并将其添加到“配置 AWS 凭证”操作中。新的动作是这样的:

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v4
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}
        aws-session-token: ${{ secrets.AWS_SESSION_TOKEN }}

此修改后的工作流程按预期运行和工作,但会话令牌在一段时间后过期。果然,当我第二天再次尝试时,我收到一条错误消息,说令牌已过期。为了让它再次运行,我需要每天手动将新的会话令牌复制粘贴到 github 密钥中。

这是预期的行为吗?如果是这样,为什么教程没有提到这一点?我感觉我失去了一些东西。

编辑:

所以我可能只是犯了一个菜鸟错误。我假设我必须使用来自 AWS 访问门户的 IAM 凭证: Access keys image

而且我注意到,无论如何,所有 3 个都会在一段时间后自动更改。我认为这意味着我们不应该在这里使用这些凭据。我认为所需的实际凭据是此处所描述的。我会向我的管理员询问并及时更新这篇文章。

amazon-web-services github-actions amazon-iam amazon-ecs
1个回答
0
投票

AWS 强烈建议不要对 CI 工作流程使用访问令牌,而应使用 AWS OpenID Connect (OIDC)。由于该角色被锁定到特定的 GitHub 组织或存储库,因此不太容易出错并且更安全。

1.添加 GitHub 作为身份提供商

enter image description here

  • 对于提供商 URL:使用
    https://token.actions.githubusercontent.com
  • 对于“观众”:使用
    sts.amazonaws.com

2.创建 IAM 角色

创建具有适当权限的 IAM Web 身份角色以推送到 AWS ECR。

Create IAM Web Identity role

3.配置 GitHub 操作以承担该角色

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
    - name: Checkout
      uses: actions/checkout@v4

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v4
      with:
        role-to-assume: arn:aws:iam::${{ env.AWS_ACCOUNT }}:role/${{ env.AWS_ROLE }}
        aws-region: ${{ env.AWS_REGION }}

有关更多信息,请参阅“使用 IAM 角色将 GitHub 操作连接到 AWS 中的操作 “

© www.soinside.com 2019 - 2024. All rights reserved.