AWS Lambda(Python3)でEC2インスタンス一覧を取得する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

おはようございます。AWS事業部 加藤です。

せっかくAWSを使うならLambdaを使いたい!そんな訳でPython3でLambdaを触ってみます。

目的

  • EC2インスタンスIDの一覧を取得する
  • 実行時にリージョンを指定する

やってみた

IAMロール作成

Lambda実行用のIAMロールを作成します。

項目
使用するサービス Lambda
アタッチするポリシー AmazonEC2ReadOnlyAccess
ロール名 LambdaRoleEC2ReadOnly

マネジメントコンソールでIAMの画面を開きロール作成を押します。

Lambdaが使用するロールなので、使用するサービスはLambdaを選択します。

EC2の読み取り権限があれば十分なので、「AmazonEC2ReadOnlyAccess」をアタッチします。

ロール名を「LambdaRoleEC2ReadOnly」にしました。既存の他ロールとフォーマットを揃えたいなど理由ある場合は任意の名称でOKです。

Lambdaファンクション作成

Hello World

ファンクションを作成します。

項目
作成方法 一から作成
ランタイム Python3.6
ロール 既存のロールを選択
既存のロール LambdaRoleEC2ReadOnly

マネジメントコンソールでLambdaの画面を開きます。キャプチャはウェルカムページ(Lambda初回使用時)の場合です。

関数の作成をクリックします。

サンプルは使わずに作成したいので、「一から作成」を選択します。

各項目を上記の表にしたがって入力・選択し「関数の作成」をクリックします。

Python3で「一から作成」を選択した場合は、以下のようなHelloWorldのコードが作成されました。

関数「lambda_handler」が2つの引数event, context を持っていて、返り値は「Hello from Lambda」という文字列ですね。

早速実行してみます、テストというボタンがあるのでクリックします。

「テストイベントの設定」という画面が開きました。

とりあえずイベント名を「MyHelloWorld」と設定して、そのまま作成します。

元の画面に戻りました。コンボボックスで作成したテストイベントが選択されています。

「テスト」をクリックします。

実行結果を展開すると、「Hello from Lambda」と表示されました。

リージョンの受け取り

作ろうとしているファンクションは実行時にリージョンを指定し、リージョン内のインスタンスID一覧を出力します。

まずは、テストデータでリージョンを受け取りコンソール出力してみましょう。

「テストイベントの設定」画面へ移行します。

「RegionTokyo」というイベントを作成します。

{
  "Region": "ap-northeast-1"
}

コードを書き換えます。

def lambda_handler(event, context):
    return event['Region']

受け取ったデータはeventにdict型で格納されています。キー: Regionを取り出したいので event['Region'] と記述します。

保存して、テストしてみます。

リージョンを受け取ることができました。

インスタンスID出力

EC2の情報を受け取れるようにコードを書き換えて実行します。

import boto3;

def lambda_handler(event, context):
    client = boto3.client('ec2', event['Region'])
    responce = client.describe_instances()
    print (responce)
    return event['Region']

出力が長く表示しきれませんでしたが、インスタンスの情報が出力されています。

responceがdict型なので、return responceとせず、printで表示しました。

インスタンスIDのみ取得するために、更にコードを書き換えます。

import boto3;

def lambda_handler(event, context):
    client = boto3.client('ec2', event['Region'])
    responce = client.describe_instances()
    all_list = []
    for reservation in responce['Reservations']:
      for instance in reservation['Instances']:
        all_list.append(instance['InstanceId'])

    return all_list

実行します。

インスタンスID一覧を取得できました!

あとがき

後半かなりとばしてしまいましたが、無事に動いたでしょうか?
このままでは、Lambdaを使っている意味が無いので、さらに書き換えて使えるようにしていきます。
最終的には、任意のタグをデータとして受け取ってインスタンス情報を出力させたいです。