Lambda関数を手軽にデプロイする

久々にエンジニアよりな内容ですが、動機は技術的興味とは全く関係ありません。
あるキャラクターが好きで、その子がかわいいことをただ毎日つぶやきたいというものでした。

ただ、もともと表題の対応自体は別件でやったことがあります。
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 関数も簡単に作成できるので、一度使ってみることをお勧めします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA