はじめに
ec2のリストを取得します。lambdaで取得したリストをs3に出力します。
内容
s3バケットの準備
ファイルを作成するためのs3バケットを作成します。my-resource-listとしました。
lambda関数の設定
lambda関数に下記のポリシーをアタッチします。
- 
AmazonEC2ReadOnlyAccessec2を参照するため - 
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()からは他にも様々な情報を取得することができます。
参考文献