问题描述
想要在 AWS 中了解 IAM 角色的最后使用时间,类似于在 GUI 中选择一个角色并点击删除,然后在确认删除时显示角色的最后使用时间。用户希望能够在不使用 GUI 的情况下获取 IAM 角色的最后使用时间。最理想的情况是通过 AWS CLI 或 Boto3 脚本获取这些数据。是否有办法实现这个需求?
解决方案
请注意以下操作可能涉及 AWS 的版本差异及数据隐私,确保按照官方文档操作,并妥善保护敏感数据。
方案1:使用 Amazon CloudTrail 和 CloudWatch
Amazon CloudTrail 可以追踪所有 API 使用情况,而 CloudWatch 可以用于监控和分析日志事件。以下是如何通过 CloudTrail 和 CloudWatch 获取 IAM 角色的最后使用时间的步骤:
- 创建一个 CloudTrail。
- 在 AWS 控制台中,创建一个新的 CloudTrail。
- 配置 CloudTrail 将日志事件发送到 CloudWatch Logs。
- 在 CloudWatch 中搜索 “AssumedRole” 事件。
- 在 CloudWatch Logs 中,选择刚刚创建的日志组,搜索包含 “AssumedRole” 的日志事件。
- 这些事件将显示角色的最后使用时间以及其他相关信息。
方案2:使用 AWS SDKs 编写脚本
你可以使用 AWS SDKs 编写脚本来获取 IAM 角色的最后使用时间。以下是使用 AWS SDK for Go(Golang)编写脚本的步骤:
- 导入必要的包。
go
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"context"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/iam"
) - 初始化 AWS 会话和 IAM 客户端。
go
cfg, err := config.LoadDefaultConfig()
svc := iam.NewFromConfig(cfg) - 获取角色列表,并遍历角色。
“`go
roles_iam, err := svc.ListRoles(context.Background(), &iam.ListRolesInput{PathPrefix: aws.String(“/”)})
if err != nil {
fmt.Println(“Error”, err)
return
}
roles_list := roles_iam.Roles
for i := range roles_list {
role_name := roles_list[i].RoleName
// 使用 GetRoleInput 获取角色信息
input := &iam.GetRoleInput{
RoleName: aws.String(roles_list[i].RoleName),
}
role_info, err := svc.GetRole(context.Background(), input)
if err != nil {
fmt.Println(“Error”, err)
}
// 检查角色是否从未使用过
if role_info.Role.RoleLastUsed.LastUsedDate == nil {
fmt.Printf("Role %s has never been used\n", role_name)
// 可以将未使用的角色名称保存在一个列表中
continue
}
last_used_date := *role_info.Role.RoleLastUsed.LastUsedDate
// 处理最后使用时间数据
}
“`
通过以上步骤,你可以获取 IAM 角色的最后使用时间以及其他相关信息。
方案3:使用 AWS CLI 命令
你也可以使用 AWS CLI 命令来获取 IAM 角色的最后使用时间。以下是一个示例脚本:
#!/bin/bash
# 获取所有角色的 ARN 列表
ROLES=$(aws iam list-roles --query "Roles[*].Arn" --output text)
for ROLE in $ROLES
do
# 使用 generate-service-last-accessed-details 命令生成服务最后访问详情
JOBID=$(aws iam generate-service-last-accessed-details --arn $ROLE --query "JobId" --output text)
# 使用 get-service-last-accessed-details-with-entities 命令获取最后访问详情
NAMESPACES=$(aws iam get-service-last-accessed-details --job-id $JOBID --query "ServicesLastAccessed[*].ServiceNamespace" --output text)
for NAMESPACE in $NAMESPACES
do
# 获取每个命名空间的详细信息
aws iam get-service-last-accessed-details-with-entities --job-id $JOBID --service-namespace $NAMESPACE
done
done
以上脚本使用了 AWS CLI 命令来生成和获取 IAM 角色的最后使用时间信息。
请根据实际情况选择适合的方案,并确保在操作 AWS 资源时遵循安全和最佳实践。
方案4:使用 AWS CLI 命令(最佳回答)
经过与 AWS 支持的咨询,可以使用 AWS CLI 的一些函数来获取 IAM 角色的最后访问时间。以下是使用 AWS CLI 命令的示例脚本:
#!/bin/bash
# 获取所有角色的 ARN 列表
ROLES=$(aws iam list-roles --query "Roles[*].Arn" --output text)
for ROLE in $ROLES
do
# 使用 generate-service-last-accessed-details 命令生成服务最后访问详情
JOBID=$(aws iam generate-service-last-accessed-details --arn $ROLE --query "JobId" --output text)
# 使用 get-service-last-accessed-details-with-entities 命令获取最后访问详情
NAMESPACES=$(aws iam get-service-last-accessed-details --job-id $JOBID --query "ServicesLastAccessed[*].ServiceNamespace" --output text)
for NAMESPACE in $NAMESPACES
do
# 获取每个命名空间的详细信息
aws iam get-service-last-accessed-details-with-entities --job-id $JOBID --service-namespace $NAMESPACE
done
done
通过以上操作,你可以使用 AWS CLI 获取 IAM 角色的最后使用时间。请注意,根据 AWS 文档操作,确保脚本的可靠性和数据的安全性。
结论
通过以上不同的方案,你可以获取 AWS IAM 角色的最后使用时间。根据你的需求和