You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Action执行AWS Staging环境DB迁移报sts:TagSession权限错误原因咨询

问题背景

计划通过GitHub Action在AWS Staging环境执行DB迁移操作,对应工作流配置如下:

name: db migration for stg.

on:
  push:
    branches:
      - staging
    paths:
      - api/db/migrate/**

jobs:
  migration:
    name: DB Migration
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Configure AWS credentials
    uses: aws-actions/configure-aws-credentials@v1
    with:
      aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
      aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      role-to-assume: ${{ secrets.AWS_ASSUME_ROLE_ARN_STG }}
      role-duration-seconds: 1200
      aws-region: ap-northeast-1
     - uses: ruby/setup-ruby@v1
     with:
      ruby-version: '2.7.2'
     - name: ssh configure
       env:
         SSH_SECRET_KEY: ${{ secrets.SSH_SECRET_KEY }}
       run: |
         mkdir -p ~/.ssh && touch ~/.ssh/config
         echo 'host i-* mi-*' >> ~/.ssh/config
         echo '  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"' >> ~/.ssh/config
         echo $SSH_SECRET_KEY | base64 -d > ~/.ssh/id_rsa2
         chmod 0600 ~/.ssh/id_rsa2
      - name: db migration
        env:
          RAILS_ENV: <env>
          RAILS_MASTER_KEY: <key>
          RDS_HOSTNAME: 127.0.0.1
          RDS_DB_NAME: <db_name>
          RDS_USERNAME: <username>
          RDS_PASSWORD: <password>
          RDS_PORT: 9999
          STEP_SERVER_ID: <id>
          DB_HOST: <host>
          working-directory: ./api
          run: |
            ssh -f -N -L $RDS_PORT:$DB_HOST:3306 -i ~/.ssh/id_rsa2 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ssm-user@$STEP_SERVER_ID
            sudo apt-get -yqq install libpq-dev
            gem install bundler
            bundle install --jobs 4 --retry 3
            bundle exec rails db:migrate
报错信息

工作流运行到aws-actions/configure-aws-credentials@v1步骤时触发如下报错:

Run aws-actions/configure-aws-credentials@v1
 with:
  aws-access-key-id: ***
  aws-secret-access-key: ***
  role-to-assume: ***
  role-duration-seconds: 1200
  aws-region: ap-northeast-1

Error: User: arn:aws:iam::***:user/github_user is not authorized to perform: sts:TagSession on resource: ***
现有IAM权限配置

当前使用的github_user IAM权限策略如下:

{
  "Version": "2012-10-17",
  "Statement": [
     {
        "Effect": "Allow",
        "Action": "sts:*",
        "Resource": "*"
     }
   ] 
}
故障原因及解决方案

核心原理

aws-actions/configure-aws-credentials Action默认会在AssumeRole时自动添加GitHub上下文相关的会话标签(仓库名、工作流名称、操作人等),该操作需要调用sts:TagSession接口,你现有配置的权限不满足该接口的调用要求。

可能的具体原因

  • 目标Assume角色(即AWS_ASSUME_ROLE_ARN_STG对应的IAM角色)的信任策略未允许sts:TagSession操作:你给github_user配置的sts:*权限仅代表该用户有调用STS接口的权限,但目标角色的信任策略是独立的校验环节,必须在信任策略中显式允许主体执行sts:TagSession才能正常打会话标签。
  • 你使用的AWS账号属于组织架构,存在SCP(服务控制策略)限制了sts:TagSession操作的调用,或者目标角色附加的权限边界禁止了该操作。

快速解决方案

你可以直接关闭Action的会话标签功能,跳过sts:TagSession的调用,修改Action配置添加role-skip-session-tagging: true参数即可:

- name: Configure AWS credentials
  uses: aws-actions/configure-aws-credentials@v1
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    role-to-assume: ${{ secrets.AWS_ASSUME_ROLE_ARN_STG }}
    role-duration-seconds: 1200
    aws-region: ap-northeast-1
    role-skip-session-tagging: true # 新增该参数关闭标签功能

完整权限解决方案

如果需要保留会话标签功能,你需要修改目标Assume角色的信任策略,添加sts:TagSession的允许规则,示例如下:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::***:user/github_user"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
额外注意

你提供的工作流配置存在多处缩进错误,例如uses: aws-actions/configure-aws-credentials@v1、uses: ruby/setup-ruby@v1等行的缩进层级不符合yaml规范,修复权限问题后需要同步修正缩进才能保证工作流正常运行。

内容的提问来源于stack exchange,提问作者Ragnar921

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:06:03