如何使用Java SDK获取运行中Amazon EC2实例的三类指定配置信息
AWS Java SDK 获取EC2三类信息的实现方案
1. 查询拥有S3访问权限的运行中EC2实例
EC2的S3访问权限默认关联实例绑定的IAM角色,对应实现逻辑如下:
- 调用
ec2Client.describeInstances()筛选状态为running的实例,提取每个实例的IamInstanceProfile字段,拿到实例配置的IAM实例配置文件ARN - 调用
iamClient.getInstanceProfile()传入上述ARN,获取关联的IAM角色名称 - 调用
iamClient.listAttachedRolePolicies()和iamClient.getRolePolicy()分别查询角色的托管策略和内联策略,解析策略文档中是否包含Allow效果、且动作包含s3:*或特定S3操作的语句
注意:需要额外处理策略中的资源限制、条件判断避免误判;如果实例内部硬编码了AWS访问密钥,该方式无法识别,需通过实例内部审计排查
2. 查询配置了控制台账户的运行中EC2实例
EC2实例的本地操作系统账户属于实例内部配置,AWS公有API无法直接查询,可通过以下方案覆盖场景:
- 若实例开启了AWS Systems Manager (SSM) 托管:调用
ssmClient.sendCommand(),给运行中实例执行查询系统用户的命令(Linux执行cat /etc/passwd、Windows执行net user),解析返回结果判断是否有可登录控制台的账户 - 若实例未开启SSM托管:只能通过实例本身的运维审计日志、或人工登录验证,无公开AWS API可直接获取该数据
3. 查询绑定公网开放弹性IP的运行中EC2实例
实现逻辑如下:
- 调用
ec2Client.describeAddresses()获取所有弹性IP列表,筛选出已经关联实例ID(instanceId不为空)的弹性IP - 调用
ec2Client.describeSecurityGroups(),查询关联实例绑定的所有安全组规则,检查入方向规则是否存在允许0.0.0.0/0(IPv4)或::/0(IPv6)访问实例对应端口的配置 - 同时确认实例所属子网的网络ACL入方向未封禁公网访问、实例已配置互联网网关路由,即可判定该弹性IP对公网开放
依赖说明
你需要在项目中引入AWS Java SDK的EC2、IAM、SSM三个服务的对应依赖包,所有API调用前需先完成AWS身份凭证初始化(环境变量、本地凭证文件、IAM角色等方式均可)。
内容的提问来源于stack exchange,提问作者JAMSHAID
相关产品推荐
相关产品推荐

