AWS Lambda

サーバレスフレームワークを用いてAWS LambdaからEC2タグバリューを取得してみた


概要

こんにちは、テクニカルサポートの牛山です。

今回は、serverless framworkでpythonを使用して、LambdaからEC2インスタンスのタグにある「Value」値を取得してみたいと思います。

前提条件

  • awsコマンドインストール済で、aws configure認証情報設定済であること。
  • serverlessコマンドインストール済みであること。

プロジェクト作成

sls -t aws-python3

  1. What do you want to make? AWS - Python - Starter
  2. What do you want to call this project? serverless-framework-python-ec2
  3. Do you want to login/register to Serverless Dashboard? No
  4. Do you want to deploy your project? No

実行すると、1 ~ 4まで尋ねられるのでそれぞれ上記の様に回答します。

※「Serverless: Deprecation warning: Detected unrecognized CLI options: "--t".」の様な警告が出ますが問題ありません。

tree serverless-framework-python-ec2/

serverless-framework-python-ec2/
├── README.md
├── handler.py
└── serverless.yml

→この様なディレクトリ構造になっていることを確認します。

serverless.ymlの編集

以下内容へ追記変更します。

今回、EC2の読み取りが必要になるので、マネージドポリシーにあるリードオンリーポリシーを指定しています。

arn情報は、iamサービスからポリシーより該当のポリシーを選択すると見られるのでコピペするようにします。

 provider:
   name: aws
   runtime: python3.8
+  memorySize: 512
+  timeout: 900
   lambdaHashingVersion: 20201221
+  stage: prod
+  region: ap-northeast-1
+  stackName: serverless-framework-python-ec2-stack
+  iam:
+    role:
+      managedPolicies:
+        - arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess

 functions:
-  hello:
-    handler: handler.hello
+  main:
+    handler: handler.main

event.jsonの作成

aws ec2 describe-instances

コンソール上で、上記コマンドを叩き、json内容を取得します。

  • 出力された内容をすべてコピーし、event.jsonに貼り付けます。
    認証エラーが出力される場合、iamロールもしくはaws configureに設定しているiamユーザにEC2へのアクセス権を付与してください。
    必ずAWS環境にEC2が1つ以上建っている状態でおこなってください。

handler.pyの編集1

echo -n > handler.py

いったん、ファイルを空にします。

vi handler.py

import datetime
import boto3

def main( event, context ):
    data = [ ]
    #my_client = boto3.client( 'ec2' )
    #ec2_describe_instances_dict = my_client.describe_instances( )
    ec2_describe_instances_dict = event

    print( '----------------------' )
    print( datetime.datetime.now( ) )

    for reservations in ec2_describe_instances_dict[ 'Reservations' ]:
        for instances in reservations[ 'Instances' ]:
            for tags in instances[ 'Tags' ]:
                data.append( tags[ 'Value' ] )
                print( tags[ 'Value' ] )

    return data

ローカル実行確認

sls invoke local -f main -p event.json

----------------------
YYYY-MM-DD hh:mm:ss.xxxxxx

serverless-test-ec2
[
    "serverless-test-ec2"
]

handler.pyの編集2

ローカル実行で、正常にEC2のタグ情報を取得することができましたので、AWS環境デプロイ時にeventではなく、SDKから取得できるように以下内容へ変更します。

 def main( event, context ):
     data = [ ]
-    #my_client = boto3.client( 'ec2' )
-    #ec2_describe_instances_dict = my_client.describe_instances( )
-    ec2_describe_instances_dict = event
+    my_client = boto3.client( 'ec2' )
+    ec2_describe_instances_dict = my_client.describe_instances( )
+    #ec2_describe_instances_dict = event

     print( '----------------------' )
     print( datetime.datetime.now( ) )

AWS環境にデプロイ

実際にAWS環境へデプロイを実施します。

CloudFormationでStackが作成され、Lambdaに今回作成した、プログラムが自動的にデプロイされます。

sls deploy

Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
........
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service serverless-framework-python-ec2.zip file to S3 (4.78 kB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
...............
Serverless: Stack update finished...
Service Information
service: serverless-framework-python-ec2
stage: prod
region: ap-northeast-1
stack: serverless-framework-python-ec2-stack
resources: 6
api keys:
  None
endpoints:
functions:
  main: serverless-framework-python-ec2-prod-main
layers:
  None

sls deploy list

このコマンドを打つと、デプロイした時刻および、関連する情報が確認できます。

動作確認

以下、コマンドでデプロイした関数を実行できます。

また、実行後のログ内容も確認することができるので便利です。

sls invoke -f main

[
    "serverless-test-ec2"
]

sls logs -f main

・・・
----------------------
YYYY-MM-DD hh:mm:ss.xxxxxx
serverless-test-ec2
・・・

最後にAWS環境作成した環境を以下、コマンドで削除できます。

sls remove

無事に削除が完了すると「Serverless: Stack delete finished...」と出力されます。

今回用に検証用で作成したEC2インスタンスがある場合は、手動で削除する必要があるので注意してください。

まとめ

pythonを用いてserverless frameworkでデプロイし削除するとこまでやってみました。

ローカル環境でエミュレートでき比較的、開発しやすい環境かなと思いました。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA