使用configure-aws-credentials与s3-sync-action时遇InvalidAccessKeyId错误
解决GitHub Actions同步S3时的InvalidAccessKeyId错误
核心问题分析
你遇到的错误是因为临时AWS凭证需要三个完整要素(Access Key ID、Secret Access Key、Session Token),但你只传给s3-sync-action前两个,缺少会话令牌(Session Token),导致AWS无法识别你的临时密钥。另外,configure-aws-credentials已经自动把凭证注入到当前Job的环境变量中,完全不需要手动传递步骤输出的凭证。
修复方案
方案1:直接使用自动注入的凭证(推荐)
修改GitHub Actions配置,删掉s3-sync-action中手动传递的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,让它直接读取configure-aws-credentials设置好的环境变量:
name: Upload Website on: workflow_dispatch: push: branches: - main permissions: id-token: write # 必须,用于请求JWT contents: read packages: write jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v3 with: role-to-assume: arn:aws:iam::(你的账号ID):role/你的角色名 aws-region: 'us-east-1' - uses: jakejarvis/s3-sync-action@master with: args: --acl private --follow-symlinks --delete env: AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} AWS_REGION: 'us-east-1' SOURCE_DIR: 'website'
方案2:手动传递完整临时凭证(不推荐)
如果一定要手动传递步骤输出的凭证,必须补充AWS_SESSION_TOKEN:
# ... 其他配置保持不变 ... - uses: jakejarvis/s3-sync-action@master with: args: --acl private --follow-symlinks --delete env: AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} AWS_ACCESS_KEY_ID: ${{ steps.creds.outputs.aws-access-key-id }} AWS_SECRET_ACCESS_KEY: ${{ steps.creds.outputs.aws-secret-access-key }} AWS_SESSION_TOKEN: ${{ steps.creds.outputs.aws-session-token }} # 必须添加这一行 AWS_REGION: 'us-east-1' SOURCE_DIR: 'website'
额外检查项
- IAM角色信任策略:确保你要Assume的角色信任GitHub的OIDC提供商,信任策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::(你的账号ID):oidc-provider/token.actions.githubusercontent.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com" }, "StringLike": { "token.actions.githubusercontent.com:sub": "repo:你的GitHub用户名/仓库名:*" } } } ] }
- IAM角色权限:确保角色拥有S3同步所需的核心权限,权限策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::你的S3桶名", "arn:aws:s3:::你的S3桶名/*" ] } ] }
内容的提问来源于stack exchange,提问作者Austin Sharp
相关产品推荐
相关产品推荐

