다수의 AWS 계정을 사용하고 있을 경우에 각 계정 콘솔로 접속해서 서비스 사용현황을 확인하기가 매우 번거롭다.
이런 상황에서 사용할 수 있는 자동화 스크립트 및 AWS Native Service를 알아보았다.
방법1. 자동화 스크립트 (boto3)
애플리케이션 개발 및 관리를 위한 도구로 다양한 언어에서 SDK를 지원한다. 평소 python으로 스크립트 제작하는게 익숙했기 때문에 boto3를 선택했다.
boto3를 불러와서, client라는 인스턴스를 통해 aws service를 사용하면 된다. 아래 코드에선 resourcegrouptaggingapi 를 사용해 리소스 전체 현황을 조회해봤다.
정말 사용하는 모든 AWS 서비스가 전부 반환되는건 아니고 지원하는 범위에서만 확인이 가능하지만, 위 링크에서 지원되는 리소스 종류를 보면 웬만한건 전부 확인할 수 있다.
스크립트 실행 전 미리 준비해놔야 할 부분
스크립트를 실행할 때 자격증명은 아래 디렉터리에 저장된 정보를 자동으로 불러와서 사용한다. 꼭 스크립트 사용전에 aws configure 명령으로 자격증명을 설정해놓자.
- ~/.aws/config
- ~/.aws/credentials
조회하고 싶은 모든 계정에 api를 사용할 수 있는 정책을 가진 Role 을 생성해놔야 한다.
- policy : ReadOnlyAccess 관리형 정책을 붙임
- trust relationship : assume_role을 사용할 수 있게 할 주체를 지정해야 한다. EC2 환경에서 스크립트를 실행시킬 거라 신뢰관계에 EC2 서비스와, 조회할 계정을 넣어놨다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com",
"AWS": "arn:aws:iam::{AccountID}:root"
},
"Action": "sts:AssumeRole"
}
]
}
조회 시 사용할 Role에는 assume role을 수행할 수 있는 정책이 꼭 필요하다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": "*"
}
]
}
import boto3
from boto3.session import Session
import pandas as pd
accounts = []
def assume_role(arn, session_name):
client = boto3.client('sts')
response = client.assume_role(RoleArn=arn, RoleSessionName=session_name)
session = Session(aws_access_key_id=response['Credentials']['AccessKeyId'],
aws_secret_access_key=response['Credentials']['SecretAccessKey'],
aws_session_token=response['Credentials']['SessionToken'])
return session
def get_org_accounts():
client = boto3.client('organizations')
res = client.list_accounts()
for account in res['Accounts']:
accounts.append(account['Id'])
get_org_accounts()
data = []
for account in accounts:
try:
arn_name = f"arn:aws:iam::{account}:role/resourcecheck"
session = assume_role(arn_name, "resourcecheck")
client = session.client('resourcegroupstaggingapi', region_name='ap-northeast-2')
except Exception as e:
continue
paginator=client.get_paginator('get_resources')
page_iterator = paginator.paginate()
for page in page_iterator:
for resource in page['ResourceTagMappingList']:
data.append(resource)
df = pd.DataFrame(data)
df.to_csv('out.csv', header=True, index=True, encoding='utf8')
assume_role 함수
- 함수명 그대로 Role Arn과 임시 세션네임을 받아 Assume Role을 해주는 함수다. boto3에서 sts 리소스를 할당해서 사용 가능하다! 롤 전환 시 필요한 Access Key, Secret, token을 가지고 있는 session 객체를 반환해준다.
get_org_accounts 함수
- organizations 서비스의 list_accounts() api를 통해 조직에 속해있는 모든 계정정보를 가져온다.
resourcegrouptaggingapi
- get_resources 메소드로 특정 조건 또는 조건없이 모든 리소스를 조회할 수 있고, 1회 요청마다 최대 100개의 리소스 정보를 반환해준다. 리소스가 정보가 더 있으면 응답 값에 PaginationToken 값이 포함되있다.
재 요청 시 PaginationToken 값을 매개변수로 포함시키면 다음 페이지에 들어있는 추가 리소스 정보를 확인할 수 있다.
paginator
- 페이징 처리를 해준다. 모든 메소드가 다 지원되는 건 아니고 서비스별로 일부 지원된다. 다행히 get_resources 메소드는 지원되서 페이지토큰 처리 없이 한번에 모든 리소스를 불러와서 csv형태로 저장했다.
방법2. AWS Config Query
조회할 계정에 Config가 활성화 되어 있고, config 결과를 하나의 계정에서 볼 수 있도록 aggregator 설정이 되어있다면 Query를 통해 간단하게 모든 리소스 현황을 조회할 수 있다.
https://docs.aws.amazon.com/ko_kr/config/latest/developerguide/setup-aggregator-console.html
콘솔을 사용하여 집계자 설정 - AWS Config
IAM 콘솔에서 다음을 연결합니다.AWSConfigRoleForOrganizationsIAM 역할에 대한 관리형 정책. 이 정책을 연결하면 AWS Config가 AWS Organizations DescribeOrganization, ListAWSServiceAccessForOrganization 및 ListAccounts API를 호
docs.aws.amazon.com
config Query 콘솔로 들어가서, 조회 범위를 aggregator로 설정한 다음 아래 쿼리를 입력하면 사용중인 리소스타입을 그룹화해서 보여준다. 출력된 결과는 csv 형태로 다운로드도 가능해서 Config 서비스를 이용중이라면 이 방법이 훨씬 편하다.
SELECT
resourcetype
GROUP BY
resourcetype
'AWS' 카테고리의 다른 글
Organization 환경에서 AWS Config 적용 (0) | 2023.08.08 |
---|---|
RDS CCE 취약점 진단하기 (0) | 2023.08.06 |
AWS Config 테라폼 모듈 구현 (0) | 2023.08.05 |