在Databricks Python笔记本中用assume_role+Boto3连DynamoDB遇凭证错误
解决Databricks中boto3调用assume_role的NoCredentialsError问题
原因分析
报错NoCredentialsError是因为初始化sts_client时,boto3无法找到有效的AWS凭据。Databricks运行环境不会自动加载本地AWS配置,需要通过适配Databricks的方式获取或配置凭据。
解决方法
方法1:利用Databricks Instance Profile(推荐)
如果你的Databricks集群绑定了Instance Profile(需具备Assume目标IAM角色的权限),boto3可自动使用集群的Instance Profile凭据:
%pip install boto3 import boto3 # 初始化STS客户端,自动使用集群Instance Profile凭据 sts_client = boto3.client("sts", region_name="<你的AWS区域>") credentials = sts_client.assume_role( RoleArn="arn:aws:iam::<account id>:role/<role name>", RoleSessionName="test" ) # 用临时凭据创建DynamoDB会话 session = boto3.Session( aws_access_key_id=credentials["Credentials"]['AccessKeyId'], aws_secret_access_key=credentials["Credentials"]['SecretAccessKey'], aws_session_token=credentials["Credentials"]['SessionToken'], region_name="<你的AWS区域>" ) dynamodb = session.client("dynamodb") response = dynamodb.scan(TableName='table_name', Limit=1)
注意:需确保绑定的Instance Profile拥有sts:AssumeRole权限,且目标角色的信任策略已允许该Instance Profile的ARN发起assume操作。
方法2:通过Databricks Secrets存储凭据
未使用Instance Profile时,可将AWS凭据存入Databricks Secrets,再在代码中读取:
- 先在Databricks中创建密钥范围(如
aws),并存储access_key_id和secret_access_key两个密钥。 - 代码中读取并使用:
%pip install boto3 import boto3 from databricks.sdk import WorkspaceClient w = WorkspaceClient() # 从Databricks Secrets读取凭据 access_key = w.secrets.get(scope="aws", key="access_key_id") secret_key = w.secrets.get(scope="aws", key="secret_access_key") sts_client = boto3.client( "sts", aws_access_key_id=access_key, aws_secret_access_key=secret_key, region_name="<你的AWS区域>" ) credentials = sts_client.assume_role( RoleArn="arn:aws:iam::<account id>:role/<role name>", RoleSessionName="test" ) session = boto3.Session( aws_access_key_id=credentials["Credentials"]['AccessKeyId'], aws_secret_access_key=credentials["Credentials"]['SecretAccessKey'], aws_session_token=credentials["Credentials"]['SessionToken'], region_name="<你的AWS区域>" ) dynamodb = session.client("dynamodb") response = dynamodb.scan(TableName='table_name', Limit=1)
方法3:配置环境变量传递凭据
可在笔记本中设置环境变量指定凭据(不推荐硬编码,生产环境建议结合Secrets使用):
%pip install boto3 import boto3 import os # 设置环境变量 os.environ['AWS_ACCESS_KEY_ID'] = "<你的访问密钥ID>" os.environ['AWS_SECRET_ACCESS_KEY'] = "<你的秘密访问密钥>" os.environ['AWS_DEFAULT_REGION'] = "<你的AWS区域>" sts_client = boto3.client("sts") credentials = sts_client.assume_role( RoleArn="arn:aws:iam::<account id>:role/<role name>", RoleSessionName="test" ) session = boto3.Session( aws_access_key_id=credentials["Credentials"]['AccessKeyId'], aws_secret_access_key=credentials["Credentials"]['SecretAccessKey'], aws_session_token=credentials["Credentials"]['SessionToken'] ) dynamodb = session.client("dynamodb") response = dynamodb.scan(TableName='table_name', Limit=1)
额外检查项
- 确认目标IAM角色的信任策略已允许发起assume_role的主体(Instance Profile或用户ARN)访问。
- 确认Databricks集群所在VPC可访问AWS STS服务(私有网络环境需配置STS VPC端点)。
内容的提问来源于stack exchange,提问作者Vinit Khandelwal
相关产品推荐
相关产品推荐

