【问题标题】:Which role is attached to instance哪个角色附加到实例
【发布时间】:2017-01-14 15:24:26
【问题描述】:

如何检查哪些 IAM 角色及其策略 json 附加到正在运行的 EC2 实例?

是否可以通过 AWS CLI?

这里是 aws ec2 ddescribe-instances 的响应

我尝试触发命令 - aws iam list-instance-profiles
它给了我以下错误 -

调用 ListInstanceProfiles 时发生错误 (AccessDenied)操作:用户:无权执行:iam:ListInstanceProfiles on resource:

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-iam aws-cli


    【解决方案1】:

    无需寻找安装了您的机器的 AWS CLI,只要机器应该有互联网并且不会阻止元数据。 您可以从 EC2 卷曲元数据:

    curl -s http://169.254.169.254/latest/meta-data/iam/info |grep InstanceProfileArn  | awk '{print $3}'
    

    【讨论】:

      【解决方案2】:

      是的。如果您查看aws ec2 describe-instances 命令生成的响应,您会注意到生成的 JSON 数据有

      IamInstanceProfile ->(结构)

      与实例关联的 IAM 实例配置文件(如果适用)。

      Arn -> (字符串)

      实例配置文件的 Amazon 资源名称 (ARN)。

      Id -> (字符串)

      实例配置文件的 ID。

      稍后,您可以使用iam cli interface 获取策略/角色详细信息。

      aws iam get-instance-profile --instance-profile-name <name here>
      

      【讨论】:

      • 我是否需要任何附加到 EC2 实例的角色才能获取这些详细信息?
      • 我指的是这个链接 - docs.aws.amazon.com/cli/latest/reference/iam/… ,我传递了什么 instance-profile-name 值?我从哪里获得信息?
      • @AniruddhaRaje 我没有任何实例附加到任何 IAM 配置文件。您可以将describe-instance 命令的输出放在问题中吗?
      • 我尝试触发命令 - aws iam list-instance-profiles,它给了我以下错误 -> 调用 ListInstanceProfiles 操作时发生错误 (AccessDenied):用户:无权执行: iam:ListInstanceProfiles 上的资源:
      • @AniruddhaRaje 特别是IamInstanceProfile 部分。该错误意味着您的组织不允许您访问 AWS 中的 IAM 资源。请您的 AWS 管理员向您的用户授予 iam 策略。
      【解决方案3】:

      请运行 describe-instances 命令 (OSX/Linux/UNIX) 以确定所选实例是否已分配任何 IAM 角色/实例配置文件:

        aws ec2 describe-instances
          --region us-east-1
          --instance-ids i-07a2ad8872fb3226b
          --query 'Reservations[*].Instances[*].IamInstanceProfile'
      

      【讨论】:

        【解决方案4】:

        如果您使用的是 (Python):

        import boto3    
        client = boto3.client('ec2')
        
        response = client.describe_instances()
        
        # Example 1 - Short version
        for r in response['Reservations']:
          for instance in r['Instances']:
            if instance.get('IamInstanceProfile'):
              print (instance['InstanceId'], instance['IamInstanceProfile'])
        
        
        
        # Example 2 - Longer version    
        for r in response['Reservations']:
          for instance in r['Instances']:
            if instance.get('IamInstanceProfile'):
              raw = client.describe_iam_instance_profile_associations(
                Filters=[
                    {
                        'Name': 'instance-id',
                        'Values': [instance['InstanceId']]
                    }
                ]
              )
              current_res = raw.get('IamInstanceProfileAssociations')[0] # <----- We're passing only one instance id in filter so only one result is returned
              print (current_res.get('InstanceId'), current_res.get('IamInstanceProfile'))
        

        【讨论】:

          【解决方案5】:

          使用 boto3

          ec2 = session.client('ec2') 
          iam = session.client('iam')
          

          使用 ec2 客户端描述实例配置文件关联并获取实例配置文件名称

          ec2.describe_iam_instance_profile_associations(Filters=[{'Name': 'instance-id','Values': ['i-02a1cde71XXXXXX']}])
          

          回复:

          {'IamInstanceProfileAssociations': [{'AssociationId': 'iip-assoc-0f7dd8ceeXXXXXX', 'InstanceId': 'i-02a1cde71XXXXXX', 'IamInstanceProfile': {'Arn': 'arn:aws:iam::12345679012:instance-profile/XYZ', 'Id': 'XXXXXXXXXXXXX'}, 'State': 'associated'}],....... }
          

          使用 iam 客户端并调用 get_instance_profile 以获取与 instanceProfile 关联的 RoleName

          iam.get_instance_profile(InstanceProfileName='XYZ')
          

          回复:

          {'InstanceProfile': {'Path': '/', 'InstanceProfileName': 'XYZ', 'InstanceProfileId': 'XXXXXXXXXXXXX', 'Arn': arn:aws:iam::12345679012:instance-profile/XYZ', 'CreateDate': datetime.datetime(2021, 6, 10, 16, 15, 8, tzinfo=tzutc()), 'Roles': [{'Path': '/', 'RoleName': 'ABCD', ............... 'RetryAttempts': 0}}
          

          您可以选择使用 list_attached_role_policies 了解与角色关联的托管策略是什么

          iam.list_attached_role_policies(RoleName='ABCD')
          

          回复:

          {'AttachedPolicies': [{'PolicyName': 'EFG', 'PolicyArn': 'arn:aws:iam::12345679012:policy/EFG'}], 'IsTruncated': ......}}
          

          【讨论】:

            猜你喜欢
            • 2020-09-02
            • 2019-08-23
            • 2019-06-22
            • 1970-01-01
            • 2021-07-24
            • 2021-03-01
            • 1970-01-01
            • 2019-01-18
            • 2022-01-13
            相关资源
            最近更新 更多