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

创建Redshift访问S3只读的IAM角色时遇InvalidClientTokenId错误求助

解决AWS IAM角色创建时的InvalidClientTokenId错误

问题描述

尝试创建IAM角色并附加AmazonS3ReadOnlyAccess策略时,收到错误:调用CreateRole操作时出错(InvalidClientTokenId):请求中包含的安全令牌无效。 已配置AWS访问密钥和安全密钥,但问题未解决。

排查与解决步骤

1. 验证AWS凭证有效性

  • 检查~/.aws/credentials文件中的aws_access_key_id和aws_secret_access_key是否完全正确,无拼写错误、多余空格或换行符
  • 登录AWS控制台,进入IAM用户页面,确认该凭证对应的用户状态为启用,且凭证未过期或被删除
  • 执行命令aws configure list(已安装AWS CLI的情况下),查看当前生效的凭证信息,确认是否与预期一致

2. 检查SDK凭证加载逻辑

  • 如果使用boto3,确认是否正确加载了目标配置文件:
    • 默认加载~/.aws/credentials,若使用自定义profile,需在初始化客户端时指定:
      iam = boto3.client('iam', profile_name='your-custom-profile')
      
    • 检查系统环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,这两个变量会优先于配置文件中的凭证,可通过echo $AWS_ACCESS_KEY_ID(Linux/macOS)或echo %AWS_ACCESS_KEY_ID%(Windows)查看是否有值覆盖了配置

3. 确认IAM用户权限

确保当前使用的IAM用户拥有以下权限:

  • iam:CreateRole
  • iam:AttachRolePolicy
  • iam:GetRole
    可通过IAM控制台为用户附加IAMFullAccess(测试用)或自定义权限策略来验证

4. 优化代码异常处理

原代码中attach_role_policy和get_role未包含在异常捕获块中,若角色创建失败后继续执行会引发额外错误,建议将所有操作纳入异常处理:

import boto3
import json

# 初始化IAM客户端,指定profile(如果需要)
iam = boto3.client('iam', profile_name='your-profile')
DWH_IAM_ROLE_NAME = "your-dwh-role-name"

try:
    print('1.1 Creating a new IAM Role')
    dwhRole = iam.create_role(
        Path='/',
        RoleName=DWH_IAM_ROLE_NAME,
        Description='Allows Redshift clusters to call AWS services on your behalf.',
        AssumeRolePolicyDocument=json.dumps({
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Principal": {
                    "Service": "redshift.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole"
                }
              ]
            }),
    )

    print('1.2 Attaching Policy')
    attach_response = iam.attach_role_policy(
        RoleName=DWH_IAM_ROLE_NAME,
        PolicyArn="arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
    )
    if attach_response['ResponseMetadata']['HTTPStatusCode'] == 200:
        print("策略附加成功")

    print('1.3 Get the IAM role ARN')
    roleArn = iam.get_role(RoleName=DWH_IAM_ROLE_NAME)['Role']['Arn']
    print(roleArn)

except Exception as e:
    print(f"错误详情: {e}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:25:39