我正在尝试设置一个 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 凭证:
而且我注意到,无论如何,所有 3 个都会在一段时间后自动更改。我认为这意味着我们不应该在这里使用这些凭据。我认为所需的实际凭据是此处所描述的。我会向我的管理员询问并及时更新这篇文章。
AWS 强烈建议不要对 CI 工作流程使用访问令牌,而应使用 AWS OpenID Connect (OIDC)。由于该角色被锁定到特定的 GitHub 组织或存储库,因此不太容易出错并且更安全。
https://token.actions.githubusercontent.com
sts.amazonaws.com
创建具有适当权限的 IAM Web 身份角色以推送到 AWS ECR。
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 中的操作 “。