はじめに
ec2のリストを取得します。lambdaで取得したリストをs3に出力します。
内容
s3バケットの準備
ファイルを作成するためのs3バケットを作成します。my-resource-list
としました。
lambda関数の設定
lambda関数に下記のポリシーをアタッチします。
-
AmazonEC2ReadOnlyAccess
ec2を参照するため -
my-resource-list
バケットへのs3:PutObject
ファイルを出力するため
また、タイムアウト時間をデフォルトの3秒から10秒にしました。これはec2.describe_instances
の実行時間が3秒を超えたためです。
lambda関数を作る
pythonでboto3を利用してec2情報を取得します。関数ec2.describe_instances()
で取得したdictから必要な情報をcsvにして保管するようにしました。
import json
import boto3
BUCKET_NAME='my-resource-list' #ファイルを保管するs3バケット名
FILE_NAME = 'ec2_resources' #s3バケット内のファイル名
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
#ec2情報の取得
ec2_data = ec2.describe_instances()
#ec2情報の必要な項目を抽出
my_ec2_list = ''
for ec2_reservation in ec2_data['Reservations']:
for ec2_instance in ec2_reservation['Instances']:
ec2_instance_id = ec2_instance['InstanceId']
ec2_instance_type = ec2_instance['InstanceType']
ec2_instance_state = ec2_instance['State']['Name']
ec2_instance_IP = ec2_instance['PrivateIpAddress']
ec2_instance_SubnetId = ec2_instance['SubnetId']
my_ec2_list += ec2_instance_id + ',' + ec2_instance_type + ',' + ec2_instance_state + ',' + ec2_instance_SubnetId + ',' + ec2_instance_IP + '\n'
#s3へのアップロード
response = upload_s3(my_ec2_list, FILE_NAME + '.csv')
return {
'statusCode': 200,
#'body': jd
'body': json.dumps(my_ec2_list)
}
#upload to s3
def upload_s3(naiyou, filename):
client = boto3.client('s3')
response = client.put_object(
Body = naiyou,
Bucket = BUCKET_NAME,
Key = filename,
)
return response
下記のようなec2の情報を取得することができます。ヘッダは付きません。
InstanceId | InstanceType | State | SubnetId | PrivateIpAddress |
---|---|---|---|---|
i-0cb686b49c8c81b27 | t3a.nano | running | subnet-0a9dc7996b385f5e3 | 10.0.0.22 |
i-0399498a701b49fba | t4g.nano | running | subnet-0a9dc7996b385f5e3 | 10.0.0.105 |
おわりに
ec2.describe_instances()
からは他にも様々な情報を取得することができます。
参考文献