如何通过AWS PowerShell CLI获取EC2实例关联的策略列表
解决AWS EC2实例关联IAM角色策略的PowerShell获取方案
要获取EC2实例关联IAM角色的所有策略,需要先通过实例的IAM实例配置文件找到绑定的IAM角色,再分别获取角色的托管策略和内联策略。以下是修改后的完整脚本:
$region = 'eu-west-3' Set-DefaultAWSRegion -Region $region $ec2 = Get-EC2Instance $ec2list = $ec2.Instances $ec2listdetails = $ec2list | ForEach-Object { # 初始化策略相关变量 $attachedPolicies = $null $inlinePolicies = $null $roleName = $null # 处理存在IAM实例配置文件的情况 if ($_.IamInstanceProfile) { # 通过实例配置文件ID获取实例配置信息 $instanceProfile = Get-IAMInstanceProfile -InstanceProfileId $_.IamInstanceProfile.Id # 实例配置文件仅关联一个角色 $role = $instanceProfile.Roles[0] $roleName = $role.RoleName # 获取角色关联的托管策略(AWS管理或自定义托管策略) $attachedPolicies = (Get-IAMAttachedRolePolicy -RoleName $roleName).PolicyName -join ', ' # 获取角色的内联策略(直接嵌入角色的策略) $inlinePolicies = (Get-IAMRolePolicy -RoleName $roleName).PolicyName -join ', ' } $properties = [ordered]@{ Name = ($_ | Select-Object -ExpandProperty tags | Where-Object -Property Key -eq Name).value InstanceState = $_.State.Name InstanceID = $_.InstanceId InstanceType = $_.InstanceType Platform = $_.Platform PlatformDetails = $_.PlatformDetails LaunchTime = $_.launchtime KeyName = $_.KeyName AmiID = $_.ImageID ImageName = (Get-EC2Image -ImageId $_.ImageID).Name IamRoleName = $roleName IamRoleID = $_.IamInstanceProfile.Id IamRoleARN = $_.IamInstanceProfile.Arn AttachedManagedPolicies = $attachedPolicies InlinePolicies = $inlinePolicies PrivateIP = $_.PrivateIpAddress SubnetId = $_.SubnetId SubnetName = (Get-EC2Subnet -subnetid ($_.SubnetId) | Select-Object -ExpandProperty tags | Where-Object -Property Key -eq Name).value NetworkInterfaceId = $_.networkinterfaces.networkinterfaceid MAC = $_.networkinterfaces.MacAddress VPCId = $_.VpcId VPCName = (Get-EC2VPC -vpcid ($_.vpcId) | Select-Object -ExpandProperty tags | Where-Object -Property Key -eq Name).value AZ = $_.placement.AvailabilityZone SG = $_.SecurityGroups.GroupName -join ', ' BackupTag = ($_ | Select-Object -ExpandProperty tags | Where-Object -Property Key -eq BackupTag).value ProductTag = ($_ | Select-Object -ExpandProperty tags | Where-Object -Property Key -eq Product).value } New-Object -TypeName PSObject -Property $properties } $ec2listdetails | Sort-Object -Property SubnetName | Export-Csv -Path "$($PWD.Path)\ec2-report-$region.csv" -NoTypeInformation
关键代码说明:
- IAM实例配置文件转角色:通过
Get-IAMInstanceProfile根据实例返回的IamInstanceProfile.Id获取实例配置文件,从中提取绑定的IAM角色(实例配置文件仅能关联一个角色)。 - 获取托管策略:使用
Get-IAMAttachedRolePolicy获取角色关联的所有托管策略,提取策略名称后用逗号拼接成字符串。 - 获取内联策略:使用
Get-IAMRolePolicy获取角色本身包含的内联策略,同样提取名称拼接。 - 兼容无角色场景:通过
if ($_.IamInstanceProfile)判断实例是否关联了IAM角色,避免无角色时触发报错。 - CSV输出优化:添加
-NoTypeInformation避免CSV文件头部生成多余的类型信息。
内容的提问来源于stack exchange,提问作者MickyD
相关产品推荐
相关产品推荐

