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

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/54d51d8c-0850-5bb1-de34-d8b3da250dd9.png)

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


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/63d04232-f11b-de66-2970-1163b51f07d7.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/7f29b131-d51c-70dc-531b-7099947294bc.png)

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

# 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関数を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/fb138ac6-59fd-e2d6-60ff-fb823ca48b03.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/e3c901b0-08d8-4940-d045-536ec95b4045.png)


# ローカル環境から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関数に反映されていればデプロイ成功です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/269cbd95-6a5d-13f6-11dc-c56c7ca10d63.png)



今回はこれで以上です。