LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-24

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0