Edited at

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

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

ソースコードは以下のようになります。


app.py

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