PythonのLambda関数の開発環境としてChaliceを使ってみます。今回はChaliceによってdeployするLambdaを**CloudWatchのEvents Scheduler(Cron)**で起動するようにします。API Gatewayは作成されません。
Chaliceの環境設定などは以下の記事を参照してください。
【AWS】Python Lambdaのdeploy - Chalice
ドキュメントは「AWS Chalice」 と 「aws/chalice - github」 になります。
#1.プロジェクトの作成
今回のLambda関数は、定期的に為替サイトをスクレイピングして、為替情報をメールしてくれる、というものです。定期的というところにCloudWatchのEvents Scheduler(Cron)を利用します。またスクレイピングにはBeautifulSoupを使うのでdeploy方法も考えなければなりません。
まずプロジェクトを作成作成します。
$ chalice new-project lambda-schedule-test
$ cd api-key-test
BeautifulSoupをカレントのvendorディレクトリにインストールします。Chaliceはdeploy時にvendorディレクトリのパッケージを一緒にアップしてくれます。
pip install beautifulsoup4 -t vendor
ソースコードは以下のようになります。
from chalice import Chalice
import boto3
from botocore.exceptions import ClientError
from bs4 import BeautifulSoup
import urllib.request as req
import pprint
app = Chalice(app_name='beatiful-soup')
# パスでなくcronを記述します
@app.schedule('cron(55 10 * * ? *)') # (10+9)時55分に起動
def cron_handler(event):
# このURLは変更されたらしいので、未公開のAPIを代用する
# url = "https://stocks.finance.yahoo.co.jp/stocks/detail/?code=usdjpy"
url = "https://api.xxxxxxxxxx.com/kawase/xml/usd"
res = req.urlopen(url)
soup = BeautifulSoup(res, "html.parser")
jpy = soup.select_one("jpy").string
print("usd/jpy=", jpy)
# -- SENDERとRECIPIENTのemailは予めSESでVerifyする必要がある
SENDER = "Sender Name <verified-mail1@gmail.com>"
RECIPIENT = "verified-mail2@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>
<p>
""" +"<p>price ="+jpy+ "</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値
deployします。
$ chalice deploy
Creating deployment package.
Updating policy for IAM role: lambda-schedule-test-dev
Updating lambda function: lambda-schedule-test-dev-cron_handler
Resources deployed:
- Lambda ARN: arn:aws:lambda:ap-northeast-1:xxxxx:function:lambda-schedule-test-dev-cron_handler
これですべて終了です。簡単ですね。特に以下の3つが自動化されているのでとても助かります。
- CloudWatch EventsによるLambda関数のスケジュールが設定される
- Lambda関数に必要なIAM Role/Plocy(今回はSES関連)が自動生成される
- vendor配下のパッケージも同時にdeployされる
今回は以上です。
#★最近の投稿
Python でいろいろスクレイピング
【AWS】Pythonの開発環境Chaliceを使ってみる - アマゾン売れ筋ランキング
【AWS】Pythonの開発環境Chaliceを使ってみる - CloudWatch Events
【AWS】Pythonの開発環境Chaliceを使ってみる - API Key
【AWS】Python Lambdaのdeploy - Chalice
【AWS】Python Lambdaのdeploy - CloudFormation