如何用role_arn替代密钥实现Lambda向DynamoDB/S3的boto3操作
实现AWS Lambda基于IAM角色访问DynamoDB和S3的完整方案
我明白你现在的困扰——硬编码密钥确实存在安全风险,换成IAM角色是非常正确的选择。下面我会一步步带你完成整个配置和代码修改的过程,确保你能顺利实现需求:
1. 创建具备所需权限的IAM角色
首先要为Lambda创建一个拥有DynamoDB写入、S3上传权限的IAM角色,同时要允许Lambda服务扮演这个角色:
- 登录AWS控制台,进入IAM服务
- 点击「角色」→「创建角色」
- 选择「Lambda」作为受信任实体类型,点击「下一步」
- 添加权限策略:
- 如果你需要精细权限(推荐),可以自定义策略,比如仅允许对指定DynamoDB表执行
PutItem、对指定S3桶执行PutObject,同时保留Lambda日志权限:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:你的区域ID:你的AWS账号ID:table/你的DynamoDB表名" }, { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::你的S3桶名/*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] } - 如果你只是快速测试,也可以直接勾选
AmazonDynamoDBFullAccess和AmazonS3FullAccess(生产环境不推荐)
- 如果你需要精细权限(推荐),可以自定义策略,比如仅允许对指定DynamoDB表执行
- 给角色命名(比如
Lambda-DynamoDB-S3-Access-Role),完成创建后记录下该角色的role_arn
2. 将IAM角色关联到Lambda函数
接下来要让你的Lambda函数使用这个角色来获取权限:
- 进入Lambda控制台,找到目标函数
- 切换到「配置」标签页→「权限」→「执行角色」→「编辑」
- 选择「使用现有角色」,然后选中刚才创建的IAM角色,保存即可
- 如果你是创建新Lambda函数,在创建页面的「执行角色」选项中直接指定该角色的ARN即可
3. 修改Lambda代码,移除硬编码密钥
原来的代码可能包含硬编码的Access Key和Secret Key,现在可以完全删除这些配置——boto3会自动通过Lambda的执行角色获取临时凭证:
旧代码(含硬编码密钥)
import boto3 dynamodb = boto3.resource('dynamodb', aws_access_key_id='YOUR_ACCESS_KEY', aws_secret_access_key='YOUR_SECRET_KEY', region_name='us-east-1') s3 = boto3.client('s3', aws_access_key_id='YOUR_ACCESS_KEY', aws_secret_access_key='YOUR_SECRET_KEY')
新代码(基于IAM角色)
import boto3 # 无需指定密钥,boto3会自动读取Lambda执行角色的临时凭证 dynamodb = boto3.resource('dynamodb', region_name='你的区域ID') s3 = boto3.client('s3') # 向DynamoDB插入数据 table = dynamodb.Table('你的DynamoDB表名') put_response = table.put_item( Item={ 'id': 'sample_001', 'content': '通过IAM角色插入的测试数据' } ) # 向S3上传文件(以临时文件为例) with open('/tmp/upload_test.txt', 'rb') as file_obj: s3.put_object( Bucket='你的S3桶名', Key='test/upload_test.txt', Body=file_obj )
关键注意事项
- Lambda执行时会自动从关联的IAM角色获取临时访问凭证,boto3的默认凭证链会自动识别并使用这些凭证,无需手动配置
- 确保IAM角色的信任策略正确(创建角色时选择Lambda作为受信任实体会自动生成),策略内容类似:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } - 如果遇到权限错误,可查看Lambda的CloudWatch日志,里面会有明确的权限缺失提示,根据提示调整IAM策略即可
内容的提问来源于stack exchange,提问作者BharathKumarMurugan
相关产品推荐
相关产品推荐

