目次
概要
こんにちは、テクニカルサポートの牛山です。
今回は、serverless framworkでpythonを使用して、LambdaからEC2インスタンスのタグにある「Value」値を取得してみたいと思います。
前提条件
- awsコマンドインストール済で、aws configure認証情報設定済であること。
- serverlessコマンドインストール済みであること。
プロジェクト作成
sls -t aws-python3
- What do you want to make? AWS - Python - Starter
- What do you want to call this project? serverless-framework-python-ec2
- Do you want to login/register to Serverless Dashboard? No
- 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でデプロイし削除するとこまでやってみました。
ローカル環境でエミュレートでき比較的、開発しやすい環境かなと思いました。
プロフィール
AWSの設計・構築をメインにおこなっています。
運用・保守をおこなう部署におりましたが、最近、アーキテクト課に異動しました。
日々精進しております。
LINK
クラウドベリージャム:プロフィールページ