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

PythonのLambda関数の開発環境としてChaliceを使ってみます。今回はChaliceによってdeployするLambdaを**CloudWatchのEvents Scheduler（Cron)**で起動するようにします。API Gatewayは作成されません。

Chaliceの環境設定などは以下の記事を参照してください。
[【AWS】Python Lambdaのdeploy - Chalice](https://qiita.com/sand/items/4642f417bf0d2b49c7e2)

ドキュメントは[「AWS Chalice」](https://chalice.readthedocs.io/en/latest/) と [「aws/chalice - github」](https://github.com/aws/chalice) になります。


#１．プロジェクトの作成

今回の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
```

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

```python: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
```

これですべて終了です。簡単ですね。特に以下の３つが自動化されているのでとても助かります。

* CloudWatch EventsによるLambda関数のスケジュールが設定される
* Lambda関数に必要なIAM Role/Plocy（今回はSES関連）が自動生成される
* vendor配下のパッケージも同時にdeployされる


今回は以上です。



#★最近の投稿
[Python でいろいろスクレイピング](https://qiita.com/sand/items/f2466320c8dde905cb3b)
[【AWS】Pythonの開発環境Chaliceを使ってみる - アマゾン売れ筋ランキング](https://qiita.com/sand/items/cfdc9957caa0aee63c0f)
[【AWS】Pythonの開発環境Chaliceを使ってみる - CloudWatch Events](https://qiita.com/sand/items/4a4c273872b266af6680)
[【AWS】Pythonの開発環境Chaliceを使ってみる - API Key](https://qiita.com/sand/items/2f8615b03c6f24c85b49)
[【AWS】Python Lambdaのdeploy - Chalice](https://qiita.com/sand/items/4642f417bf0d2b49c7e2)
[【AWS】Python Lambdaのdeploy - CloudFormation](https://qiita.com/sand/items/2b918a29bf08bfb86d32)