如何通过编程将AWS IAM角色内联策略批量转换为托管策略
可以通过AWS CLI、Boto3实现批量转换,具体实现路径和参考代码如下:
核心实现流程
- 批量拉取全量IAM角色列表,过滤出绑定了内联策略的角色
- 逐个读取角色下所有内联策略的权限文档
- 基于内联策略内容创建对应的客户托管策略,建议添加统一前缀方便后续识别管理,命名长度控制在128字符以内,替换不符合IAM命名规则的特殊字符
- 将新创建的托管策略绑定到对应角色
- 观察业务无异常后,删除角色上的原内联策略
前置注意事项
- 操作前先选择1~2个非核心角色做完整流程测试,确认权限正常、业务无影响后再进行批量操作
- AWS账号默认客户托管策略配额为1500个,若待转换的内联策略总数量超过该值,需要先在服务配额中心申请提升配额,或者将多个角色的相同权限内联策略合并为同一个托管策略,减少创建数量
- 建议保留72小时的双策略共存期(内联策略+托管策略同时绑定在角色上),确认无权限报错后再删除内联策略,避免影响线上业务
Boto3 参考代码片段
提前配置好拥有IAM读写权限的凭证,安装boto3依赖:
import boto3 import json iam_client = boto3.client('iam') account_id = boto3.client('sts').get_caller_identity()['Account'] # 自定义托管策略前缀,方便后续管理 POLICY_PREFIX = "ManagedFromInline_" # 拉取所有IAM角色 roles = iam_client.list_roles()['Roles'] for role in roles: role_name = role['RoleName'] # 过滤不需要处理的角色可自行添加判断逻辑,比如系统角色、服务关联角色 # if role_name.startswith('AWSServiceRoleFor'): # continue # 获取当前角色的所有内联策略名 inline_policy_names = iam_client.list_role_policies(RoleName=role_name)['PolicyNames'] if not inline_policy_names: continue for policy_name in inline_policy_names: # 获取内联策略的权限文档 policy_detail = iam_client.get_role_policy( RoleName=role_name, PolicyName=policy_name ) policy_doc = policy_detail['PolicyDocument'] # 生成合规的托管策略名 managed_policy_name = f"{POLICY_PREFIX}{role_name}_{policy_name}".replace('/', '_').replace('\\', '_')[:128] # 创建托管策略 new_policy = iam_client.create_policy( PolicyName=managed_policy_name, PolicyDocument=json.dumps(policy_doc), Description=f"Converted from inline policy [{policy_name}] of IAM role [{role_name}]" ) policy_arn = new_policy['Policy']['Arn'] # 绑定托管策略到当前角色 iam_client.attach_role_policy( RoleName=role_name, PolicyArn=policy_arn ) # 确认业务无异常后再取消注释执行删除内联策略操作,避免误操作导致权限丢失 # iam_client.delete_role_policy( # RoleName=role_name, # PolicyName=policy_name # )
AWS CLI 单步操作示例(可自行封装为Shell批量脚本)
- 列出指定角色的所有内联策略名
aws iam list-role-policies --role-name <目标角色名称> - 导出指定内联策略的权限文档到本地文件
aws iam get-role-policy --role-name <目标角色名称> --policy-name <内联策略名> --query PolicyDocument > policy.json - 基于导出的权限文档创建托管策略
aws iam create-policy --policy-name ManagedFromInline_<角色名>_<策略名> --policy-document file://policy.json - 将新创建的托管策略绑定到目标角色
aws iam attach-role-policy --role-name <目标角色名称> --policy-arn <新托管策略的ARN> - 验证无异常后删除原内联策略
aws iam delete-role-policy --role-name <目标角色名称> --policy-name <内联策略名>
内容的提问来源于stack exchange,提问作者xmx
相关产品推荐
相关产品推荐

