Edited at

PythonでAWS Lambdaの関数を作成する手順(現在時刻を取得してSQSキューを投げる編)

More than 1 year has passed since last update.

AWS Lambdaの関数コードを書く機会があったので、鉄板のPythonを使ってみようと思う。

せっかくだからAWSのサービスと連携させたいので、シンプルにSQSキューを投げてみよう。


1.SQSで新しいキューを作成する。

マネジメントコンソールで必須事項を入力するだけでよい。

作成ができたら、コンソール画面でURLのみメモしておく。

https://sqs.ap-northeast-1.amazonaws.com/アカウント/Lambda-Test


2.Pythonで関数コードを作成する。

Pythonの勉強も兼ねて、手順を書いていく。

環境は以下。

- python 3.7.0 (miniconda)

- MacOSX High Sierra

- Pycharm 2018.2.3


2-1. プロジェクトと仮想環境を構築する。

Pycharmで新しいプロジェクトを作成する。

1. Create New Project

2. Locationは適当に

3. Project Interpreterでは、New environment usingを選択し、condaを使うことにする。

4. 上記の流れでcreateを行うと、新規プロジェクトが作成される。

5. Projectを右クリックして、Open in Terminal

6. 以下のように表示されていればよい。

(Lambda-SQS-test) $ 


2-2. 関数を作成する。

さて、ここからは実際に以下のようなコードを新規で作成する。


enqueue.py

import logging

from datetime import datetime
import pytz
import boto3
import json

logger = logging.getLogger()
logger.setLevel(logging.INFO)

#SQSキューのURLをセット
url = "https://sqs.ap-northeast-1.amazonaws.com/アカウント/Lambda-Test"

#関数コードを実行するハンドラ
def handler(event,context):
try:
logger.info(event)
logger.info(context)

#UTCで現在時刻を取得して、JSTに変換
utc_now = datetime.now(pytz.timezone("UTC"))
jst_now = utc_now.astimezone(pytz.timezone("Asia/Tokyo"))

#秒以下を切り捨てる
replace_now = jst_now.replace(second=0, microsecond=0)

#ISOフォーマットに変換する
now = replace_now.isoformat()

#キューに送信するJSONのセット
message = {}
message["dateTime"] = now

#キューを投げる
response = boto3.client("sqs").send_message(
QueueUrl = url,
MessageBody = json.dumps(message)
)

logger.info(response)
return response
except Exception as e:
logger.error(e)
raise e



2-3. 外部モジュールのインストール

現時点ではpytzとboto3のモジュールが存在しないので、Terminalより以下コマンドでインストールする。

$ conda update conda

$ conda info -e
$ source activate Lambda-SQS-test
(Lambda-SQS-test)$ pip install --upgrade pip
(Lambda-SQS-test)$ pip install pytz -t .
(Lambda-SQS-test)$ pip install boto3 -t .


3. 関数コードをデプロイする。

プロジェクトのディレクトリをzipで固める



(Lambda-SQS-test)$ zip -r upload.zip *


4. AWS側で関数を作成する。

マネジメントコンソールの作業に戻る。


4-1. IAMロールの作成

今回はテストなので、とりあえずSQSのフル権限を持ったロールを1つ作成する。


4-2. 関数を作成し、zipをアップロードして実行


  • ロールは先程作ったものを割り当てる。

  • ハンドラには(ファイル名).(ハンドラ名)
    -- 今回の場合は enqueue.handler

できた!