Edited at

【AWS】Python Lambdaのdeploy - CloudFormation

【AWS】Python Lambdaのdeploy - CloudFormation - Qiita

【AWS】Python Lambdaのdeploy - Chalice - Qiita

CloudFormationを使えば、AWSの様々な設定やdeployを自動化できます。AWS Serverless Application Model (SAM) は、AWS が公式で提供しているサーバーレスアプリケーションのためのフレームワークです。Lambda, API Gateway, DynamoDB,Cognito,S3等、AWSのほとんどのリソースをひとまとめに管理 (作成 / 更新 / 削除) することができます。一部設定できない項目もあります。SAMはyamlファイルを書くことで定義できます。(JSONでも可能ですがここでは触れません)

定刻に定型のメールを送信するLambda関数をdeployすることにします。


1.SAMファイル

まずは以下のようなyamlを書きます。Globalsで「Runtime: python3.6」を指定していることに注意してください。中にコメントしますので、コピペするときは削除してください。またCloudWatch のEventsでcronを定義し、スケジューラを設定することに注意してください。


serverless.yml

AWSTemplateFormatVersion: "2010-09-09"

Transform: AWS::Serverless-2016-10-31
Globals:
Function:
Runtime: python3.6 # PythonのLambda関数
Timeout: 30
Tracing: Active
Environment:
Variables:
REGION: !Ref AWS::Region
Description: "Example template including Lambda"
Resources:
amazonsessample:
Type: AWS::Serverless::Function # Lambdaのリソース
Properties:
Handler: amazonsessample.handler # Handler
Policies:
- Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- ses:SendEmail # SESのSendEmailを使う
Resource:
- '*'
Events: # CloudWatch のEventsでcronを定義
ScheduleEvent:
Type: Schedule
Properties:
Schedule: cron(45 1 * * ? *)


2.Lambda関数

ここでは次のドキュメントのソースを利用します。「AWS SDK for Python (Boto) を使用して E メールを送信する - AWS公式ドキュメント」

PythonからAWSへアクセスするためには、「AWS SDK for Python (Boto3) - AWS公式ドキュメント」というライブラリを使います。


amazonsessample.py

import boto3

from botocore.exceptions import ClientError

def handler(event, context):
print("#####",event)
# -- SENDERとRECIPIENTのemailは予めSESでVerifyする必要がある
SENDER = "Sender Name <verified-email1@gmail.com>"
RECIPIENT = "verified-email2@gmail.com"

AWS_REGION = "us-west-2" # オレゴンを設定。SESでは東京は使えない。
SUBJECT = "Amazon SES Test (SDK for Python)"

BODY_TEXT = ("Amazon SES Test (Python)\r\n"
"This email was sent with Amazon SES using the "
"AWS SDK for Python (Boto)."
)

BODY_HTML = """<html>
<head></head>
<body>
<h1>Amazon SES Test (SDK for Python)</h1>
<p>This email was sent with
<a href='https://aws.amazon.com/ses/'>Amazon SES</a> using the
<a href='https://aws.amazon.com/sdk-for-python/'>
AWS SDK for Python (Boto)</a>.</p>
</body>
</html>
"""

CHARSET = "UTF-8"
client = boto3.client('ses',region_name=AWS_REGION)

try:
response = client.send_email(
Destination={
'ToAddresses': [
RECIPIENT,
],
},
Message={
'Body': {
'Html': {
'Charset': CHARSET,
'Data': BODY_HTML,
},
'Text': {
'Charset': CHARSET,
'Data': BODY_TEXT,
},
},
'Subject': {
'Charset': CHARSET,
'Data': SUBJECT,
},
},
Source=SENDER,
)

except ClientError as e:
print(e.response['Error']['Message'])
else:
print("Email sent! Message ID:"),
print(response['ResponseMetadata']['RequestId'])

return 9 # 適当なreturn値


最後にboto3をインストールしておきましょう。

pip install boto3


3.deployと削除

deployにはaws cloudformationを2つ打つだけなのですが、以下のようにshスクリプトにしておいた方が便利でしょう。ここで重要なのはstack-nameの指定です。deployはこのstack-nameのもとで行われます。またS3上にcf-template-xxxxxという(名前は任意)bucketをあらかじめ用意しておく必要があります。


go1.sh

#!/bin/bash -e

# *** deploy cloudformation yaml
aws cloudformation package --template-file serverless.yml --output-template-file serverless-output.yml --s3-bucket cf-template-xxxxx
aws cloudformation deploy --template-file serverless-output.yml --stack-name mystackname --capabilities CAPABILITY_IAM

deployした全てのリソースは、CloudFormationサービスでstack-nameを指定して、一括して削除できます。

今回は以上です。


★最近の投稿

【AWS】Pythonの開発環境Chaliceを使ってみる - アマゾン売れ筋ランキング

【AWS】Pythonの開発環境Chaliceを使ってみる - CloudWatch Events

【AWS】Pythonの開発環境Chaliceを使ってみる - API Key

【AWS】Python Lambdaのdeploy - Chalice

【AWS】Python Lambdaのdeploy - CloudFormation