久々にエンジニアよりな内容ですが、動機は技術的興味とは全く関係ありません。
あるキャラクターが好きで、その子がかわいいことをただ毎日つぶやきたいというものでした。
もうbotつくってLambdaで動かすか。
— Kazuki@囲碁麻雀好きエンジニア (@kzkamago0721) September 9, 2020
ただ、もともと表題の対応自体は別件でやったことがあります。
Redmine に日々入力した稼働時間を週単位で集計して通知してくれるようなツールです。
今回は単純な「Hello world! するだけの関数」をデプロイする手順を記載します。
前提
- 言語は Python、パッケージ管理は pipenv を使うので、これらが利用できる状況であること
- AWS アカウントの作成・認証情報の発行・
~/.aws
以下への設定ができていること - IAMユーザ・ロール・ポリシー割り当てのような「権限」に関する仕組みがある程度理解できていること
環境構築
Chaliceというライブラリを利用します。
以下でインストールできます。
$ pipenv install chalice
デプロイを実行するディレクトリ以下に .chalice/config.json
を作成します。
{
"version": "2.0",
"app_name": "test-app",
"stages": {
"dev": {
"autogen_policy": true
},
"prod": {
"manage_iam_role": false,
"iam_role_arn": "arn:aws:iam::XXXXXXXX:role/XXX",
"environment_variables": {
"KEY": "value"
}
}
}
}
上記は設定の一例です。autogen_policy
というのは、必要に応じてポリシーを自動で作ってくれるオプションです。
※もちろん、デプロイを実行するユーザに必要な権限がないとエラーになります。manage_iam_role: false
の場合、iam_role_arn
にデプロイする対象の ARN を設定してください(すでに作成された ARN を利用する場合はここを定義することになるかと思います)。environment_variables
には、Lambda 関数で利用する環境変数名と値を設定します。
次にサンプルプログラムを作成します。
# app.py
from chalice import Chalice, Cron
app = Chalice(app_name='test-app')
@app.schedule(Cron(0, 0, '*', '*', '?', '*'))
def lambda_handler(event, context={}):
print('Hello world!')
@app.schedule
で関数を定期実行させることができます。
例の設定だと「毎日0時に実行」となりますが、Lambda 側のタイムゾーンは UTC なので日本時間だと9時になってしまう点に注意が必要です。
このままだとローカルでテストするのが面倒なので、ローカル用のファイルを用意しても良いかもしれません。
# main.py
from app import lambda_handler
# ハンドラ実行時にエラーにならないようダミーの値を設定
event = {
'account': 'admin',
'detail': {},
'detail-type': 'Test Event',
'id': 'dummy',
'region': 'ap-northeast-1',
'resources': [],
'source': 'aws.events',
'time': '2019-06-24T01:23:45Z',
'version': '1.0'
}
# ローカル実行用
if __name__ == '__main__':
lambda_handler(event, context={})
以下で実行できます。
$ pipenv run python main.py
$ # Hello world!
デプロイ
chalice を利用したデプロイでは Pipfile に定義した依存関係が利用できないため、一度 requirements.txt
を作成してやる必要があります。
$ pipenv lock -r > requirements.txt
以下コマンドでデプロイされます。--stage
オプションには .chalice/config.json
で定義した stages から該当するものを指定してください。
$ chalice deploy --stage prod
最後に
かなりざっくり書きましたが、Chalice を使えば他の AWS サービス(API Gateway や SQS など)と連携する Lambda 関数も簡単に作成できるので、一度使ってみることをお勧めします。