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

如何通过编程将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批量脚本)
  1. 列出指定角色的所有内联策略名
    aws iam list-role-policies --role-name <目标角色名称>
  2. 导出指定内联策略的权限文档到本地文件
    aws iam get-role-policy --role-name <目标角色名称> --policy-name <内联策略名> --query PolicyDocument > policy.json
  3. 基于导出的权限文档创建托管策略
    aws iam create-policy --policy-name ManagedFromInline_<角色名>_<策略名> --policy-document file://policy.json
  4. 将新创建的托管策略绑定到目标角色
    aws iam attach-role-policy --role-name <目标角色名称> --policy-arn <新托管策略的ARN>
  5. 验证无异常后删除原内联策略
    aws iam delete-role-policy --role-name <目标角色名称> --policy-name <内联策略名>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:36:03