python3.7でローカルからLambda関数をデプロイする手順


What's this?

pipenvを利用してコマンド1発でローカル環境のソースコードをLmabda関数にデプロイする際の手順をまとめた記事です。

IAMからユーザー作成

最初にローカルからLambdaへのデプロイを実施するためのIAMユーザーを作成します。
IAM > ユーザー > ユーザーを追加からユーザーを作成します。

今回はユーザー名「dev_user」で作成します。
アクセスの種類はプログラムによるアクセスにチェックします。

アクセス権限は後から付与できるので一旦スキップしてユーザーを作成します。
ユーザー作成ができるとシークレットアクセスキーが発行されるのでダウンロードしてておきます。

作成されたユーザーに対してLambdaのデプロイに必要なアクセス権限を追加します。
アクセス権限 > インラインポリシーの追加
サービス:Lambdaを選択
アクション:読み込みから
GetFunctionを選択
アクション:書き込みから
UpdateFunctionCode,UpdateFunctionConfigurationを選択

リソースは全てのリソースを選択します。

これでユーザーの作成は完了です。

aws-cliのインストール

次にローカルからAWSサービスをコマンドラインで操作するためにaws-cliをインストールします。
すでにローカルにpipがインストールされていればすぐにインストールできます。

//aws-cliのインストール
sudo pip install awscli

//バージョン確認
aws --version
aws-cli/2.1.5 Python/3.9.0 Darwin/19.6.0 source/x86_64 prompt/off

aws-cliがインストールできたので先ほどダウンロードしたアクセスキーを利用してdev_userの認証情報を登録します。

//dev_userの認証情報を追加
aws configure --profile dev_user

AWS Access Key ID [None]:{.csvダウンロードしたアクセスキー}
AWS Secret Access Key [None]:{.csvダウンロードしたシークレットアクセスキー}
Default region name [None]: ap-northeast-1
Default output format [None]: json

//デフォルトユーザーをdev_userに変更
export AWS_DEFAULT_PROFILE=dev_user

//登録した認証情報の確認
aws configure list

これでコマンドラインでのAWSリソース操作ができるようになりました。

lambda関数の作成

次にAWSコンソールからlambda関数を作成します。

ランタイムはPython 3.7にします。

lmabda関数が作成されるARNが発行されるのでこちらをコピーしておきます。

ローカル環境からlambda関数をデプロイ

ローカル環境からlambda関数のデプロイは下記コマンドの実施で可能です。

//カレントディレクトリのソースファイルをzip形式で圧縮
zip -r {ファイル名}.zip . -x *.zip

//zipファイルを指定のlambda関数にアップロード
aws lambda update-function-code --function-name {ARN名} --zip-file fileb://{ファイル名}.zip

今回はこのコマンドをpythonでスクリプト化します。

//作業ディレクトリの作成
mkdir sample-lambda

cd sample-lambda

// pipenvのインストール
pip install pipenv

pipenv --python 3.7

デプロイ用lambda関数のlambda_function.pyを作成します。(中身はなんでも良いです)

次にコマンド実行用のlambda_deploy.pyを作成します。

lambda_deploy.py
import subprocess

# create zipfile
cmd = []
cmd.append("zip")
cmd.append("-r")
cmd.append("{ファイル名}.zip")
cmd.append(".")
cmd.append("-x")
cmd.append("*.zip")
subprocess.run(cmd)

# lambda deploy
cmd = []
cmd.append("aws")
cmd.append("lambda")
cmd.append("update-function-code")
cmd.append("--function-name")
cmd.append("{ARN名}")
cmd.append("--zip-file")
cmd.append("fileb://{ファイル名}.zip")

subprocess.run(cmd)

pipfileを編集し、末尾にpipenv run実行時のエイリアスを追加します。

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.7"

# pipenv run deploy -> zip圧縮とlambda関数のアップロード
[scripts]
deploy = "python lambda_deploy.py"

これで準備は完了しました。
実際に実行してデプロイされるか確認します。

//仮想環境に入る
pipenv shell

//デプロイコマンドの実行
pipenv run deploy

無事にソースコードがlambda関数に反映されていればデプロイ成功です。

今回はこれで以上です。