Featured image of post AWS Lambdaに関数を上げる「lambda-uploader」の使い方

AWS Lambdaに関数を上げる「lambda-uploader」の使い方

AWS Lambdaの関数をコマンド一発でアップロードできる「lambda-uploader」の使い方。インストール、IAMロールの用意、lambda.jsonとrequirements.txtの準備、アップロードからコンソールでの動作確認まで♪

2780文字

AWS Lambaへのアップロードを簡単に行いたい

ローカル開発はpython-lambda-localで決まり

先日、python-lambda-localを使ったローカル環境でのPythonによるLambda関数の実装及び動作確認方法についてご紹介致しました。

関連記事 【サーバーレスアークテクチャ開発】ローカル環境でAWSのLambdaスクリプトをPythonで実装する際に「python-lambda-local」で動作確認する際のインストール方法とやり方【Bot開発にオススメ】 2019/01/01 3710文字 約8分で読めます IT AWS Mac Python Windows

アップロードがめんどくさい・・・

ローカルでの動作確認は完了したので、実際にAWSに配置したい!となった場合、通常の手段ではとてもめんどくさいのがデメリットと言えるでしょう。

依存するライブラリを含めてZIP化し、マネジメントコンソールからアップロードをする、と言う作業は地味にめんどくさいのですorz

lambda-uploaderならコマンド一発

そんな面倒くさがりな筆者にぴったりなツールを見つけてしまいました!

lambda-uploaderは、ローカルのLambda用のPythonスクリプトをコマンドラインから一発でAWS Lambdaにアップロードしてくれるのです!

使い方もとても簡単で、設定ファイルを用意すれば自動でライブラリを含めたZIPを作成してくれて、アップロード時の設定も行ってくれます。

今回はシンプルなアップロードと動作確認までの手順をご紹介致します♪

手順

lambda-uploaderをインストール

まずはいつも通りpipコマンドを使ってlambda-uploaderをインストールしましょう。

pip install lambda-uploader
Collecting lambda-uploader
  Using cached https://files.pythonhosted.org/packages/9b/64/5f12a1fce98f11394e35a2030d6ed0548ee1cd952480982ad2d8921e9bb0/lambda-uploader-1.3.0.tar.gz
Requirement already satisfied: boto3>=1.4.2 in /Users/blogenist/.pyenv/versions/3.6.0/lib/python3.6/site-packages (from lambda-uploader)
Requirement already satisfied: botocore>=1.4.85 in /Users/blogenist/.pyenv/versions/3.6.0/lib/python3.6/site-packages (from lambda-uploader)
Requirement already satisfied: virtualenv in /Users/blogenist/.pyenv/versions/3.6.0/lib/python3.6/site-packages (from lambda-uploader)
Requirement already satisfied: s3transfer<0.2.0,>=0.1.10 in /Users/blogenist/.pyenv/versions/3.6.0/lib/python3.6/site-packages (from boto3>=1.4.2->lambda-uploader)
Requirement already satisfied: jmespath<1.0.0,>=0.7.1 in /Users/blogenist/.pyenv/versions/3.6.0/lib/python3.6/site-packages (from boto3>=1.4.2->lambda-uploader)
Requirement already satisfied: urllib3<1.25,>=1.20; python_version >= "3.4" in /Users/blogenist/.pyenv/versions/3.6.0/lib/python3.6/site-packages (from botocore>=1.4.85->lambda-uploader)
Requirement already satisfied: docutils>=0.10 in /Users/blogenist/.pyenv/versions/3.6.0/lib/python3.6/site-packages (from botocore>=1.4.85->lambda-uploader)
Requirement already satisfied: python-dateutil<3.0.0,>=2.1; python_version >= "2.7" in /Users/blogenist/.pyenv/versions/3.6.0/lib/python3.6/site-packages (from botocore>=1.4.85->lambda-uploader)
Requirement already satisfied: setuptools>=18.0.0 in /Users/blogenist/.pyenv/versions/3.6.0/lib/python3.6/site-packages (from virtualenv->lambda-uploader)
Requirement already satisfied: six>=1.5 in /Users/blogenist/.pyenv/versions/3.6.0/lib/python3.6/site-packages (from python-dateutil<3.0.0,>=2.1; python_version >= "2.7"->botocore>=1.4.85->lambda-uploader)
Installing collected packages: lambda-uploader
  Running setup.py install for lambda-uploader ... done
Successfully installed lambda-uploader-1.3.0

環境によっては既にインストール済みのモジュールがあると思いますが、とりあえずSuccessfully installed lambda-uploader-X.Y.Zが出力されればインストール完了です。

IAM Roleの準備

インストールが完了したら、Lambdaを取り扱えるIAM Roleを用意しましょう。

マネジメントコンソールからIAMを選択し、ロール > ロールの作成ボタンをクリックします。

次の画面では、AWSサービスが選択された状態で、Lambdaをクリックし次のステップ:アクセス権限ボタンをクリックします。

次はロールに持たせるポリシーを設定します。

今回は実行権限をつけたいのでAWSLambdaExecuteポリシーをつけていますが、用途に合わせて設定してください。

設定が終わったら次のステップ:タグボタンをクリックします。

タグにはキー/値の形式で任意のタグを設定することが出来ます。

必須ではないので未入力のまま次へ進んでも良いですが、今回は適当にnameを設定して次のステップ:確認ボタンをクリックします。

次の画面ではロール名と説明の入力と、前画面までに入力した値の確認を求められます。

問題が無ければ、ロールの作成ボタンをクリックしましょう。

これでロールが正常に作成されました。

必要ファイルの準備

インストールが完了したら、次は必要なファイルを作成していきましょう。

lambda_function.py

まずはメインとなる関数ファイルを用意しましょう。

今回は動くかの確認だけ出来れば良いので、以下のような簡単な関数を用意しましょう。

lambda_function.py
import requests

def lambda_handler(event, context):
    response = requests.get(event['url'])
    return 'Status : %d' % response.status_code

lambda.json

次にアップロードするLambda関数の概要をまとめたJsonファイルを用意します。

関数名やtimeout/memoryなどを定義します。

lambda.json
{
    "name": "lambdaUploaderTest",
    "description": "lambda-uploader test",
    "region": "ap-northeast-1",
    "handler": "lambda_function.lambda_handler",
    "role": "arn:aws:iam::XXXXXXXXXXXX:role/BlogenistBlogSample",
    "timeout": 300,
    "memory": 128
}

このJsonのrole項目の値は先ほど作成したロールのロール ARNを指定してください。

requirements.txt

次はrequirements.txtを用意します。

こちらは、作成したLambda関数が必須としている外部ライブラリを定義するファイルとなっています。

ご存知の通り、Lambdaを用意するにあたって外部ライブラリも含めてZIP化する必要があるのですが、lambda-uploaderを使えばこのファイルの記述を元に自動で行ってくれるとの事です。

しゅごい。

作成はpip freeze > requirements.txtコマンドでサクッと自動生成しちゃいましょう。

requirements.txt
boto3==1.9.76
botocore==1.12.76
certifi==2018.11.29
chardet==3.0.4
docutils==0.14
httplib2==0.12.0
idna==2.8
jmespath==0.9.3
lambda-uploader==1.3.0
oauth2==1.9.0.post1
oauthlib==2.1.0
PySocks==1.6.8
python-dateutil==2.7.5
python-lambda-local==0.1.7
requests==2.21.0
requests-oauthlib==1.1.0
s3transfer==0.1.13
six==1.12.0
tweepy==3.7.0
urllib3==1.24.1
virtualenv==16.2.0

手入力で作成しても良いですが、タイポやバージョン違いなどが発生する可能性がるので自動で作成することをオススメします。

不要なパッケージを削除

上記コマンドで作成すると、その環境にてインストールされている全てのライブラリが出力されてしまい、そのままだとZIPファイルが肥大化してしまうので、利用するもの以外は削除しておきましょう。

requirements.txt
requests==2.21.0

アップロード処理

必要ファイルは用意出来たので、対象ディレクトリに移動してlambda-uploaderを使ったアップロードを実行してみましょう。

lambda-uploader --profile <AWS cli Profile>
λ Building Package
λ Uploading Package
λ Fin

おぉ!
無事に終わりましたね。
早速AWS cliからLambda関数を取得して確認してみましょう。

aws --profile <profile名> --region ap-northeast-1 lambda get-function --function-name lambdaUploaderTest
{
    "Code": {
        "RepositoryType": "S3",
        "Location": "https://awslambda-ap-ne-1-tasks.s3.ap-northeast-1.amazonaws.com/snapshots/XXXXXXXXXXXX"
    },
    "Configuration": {
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "Version": "$LATEST",
        "CodeSha256": "XXXXXXXXXXXXXXX",
        "FunctionName": "lambdaUploaderTest",
        "VpcConfig": {
            "SubnetIds": [],
            "VpcId": "",
            "SecurityGroupIds": []
        },
        "MemorySize": 128,
        "CodeSize": 9058400,
        "FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXXXXX:function:lambdaUploaderTest",
        "Environment": {
            "Variables": {}
        },
        "Handler": "lambda_function.lambda_handler",
        "Role": "arn:aws:iam::XXXXXXXXXXXXXXX:role/BlogenistBlogSample",
        "Timeout": 300,
        "LastModified": "2019-01-15T05:05:55.185+0000",
        "Runtime": "python2.7",
        "Description": "lambda-uploader test"
    }
}

先ほどアップロードしたものが正しく登録されていそうですね♪

PythonのRuntimeの指定漏れ

しかし、先ほどアップロードしたものだとRuntimeがPython2.7になってしまっていました。

今回作成したものはPython3.6で動かしたいのですが、lambda.jsonに項目を追加することでRuntimeを変えることが出来るそうです。

以下のようにlambda.jsonを修正したら再度同じコマンドでuploadしてみましょう。

lambda.json
{
    "name": "lambdaUploaderTest",
    "description": "lambda-uploader test",
    "region": "ap-northeast-1",
    "handler": "lambda_function.lambda_handler",
    "role": "arn:aws:iam::123456789012:role/BlogenistBlogSample",
    "timeout": 300,
    "memory": 128,
    "runtime": "python3.6" // 追加
}

aws --profile <profile名> --region ap-northeast-1 lambda get-function --function-name lambdaUploaderTest
{
    "Code": {
        "RepositoryType": "S3",
        "Location": "https://awslambda-ap-ne-1-tasks.s3.ap-northeast-1.amazonaws.com/snapshots/XXXXXXXXXXXX"
    },
    "Configuration": {
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "Version": "$LATEST",
        "CodeSha256": "XXXXXXXXXXXXXXX",
        "FunctionName": "lambdaUploaderTest",
        "VpcConfig": {
            "SubnetIds": [],
            "VpcId": "",
            "SecurityGroupIds": []
        },
        "MemorySize": 128,
        "CodeSize": 9058400,
        "FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXXXXX:function:lambdaUploaderTest",
        "Environment": {
            "Variables": {}
        },
        "Handler": "lambda_function.lambda_handler",
        "Role": "arn:aws:iam::XXXXXXXXXXXXXXX:role/BlogenistBlogSample",
        "Timeout": 300,
        "LastModified": "2019-01-15T05:21:15.621+0000",
        "Runtime": "python3.6",
        "Description": "lambda-uploader test"
    }
}

正しくRuntimepython3.6に変わりましたね♪

マネジメントコンソールから動作確認

では、次は実際にアップロードされた関数の動作確認を行いましょう。

マネジメントコンソールからアップロードした関数を選択します。

関数を開いたら上部のテストボタンをクリックします。

すると、テストイベントの設定ダイアログが表示されます。

ここでは、以下のようなJsonを定義して作成ボタンをクリックしましょう。

テストイベント
{
  "url": ""
}

すると、今定義したテストイベントを選べるようになるので、そちらを選択した上でテストボタンをクリックしてみましょう。

すると、正常に動作したことが確認出来ます。

あとは、環境変数AWSサービス等の連携設定を行うことでLambda関数が完成します♪

終わりに

以上のように、手間がかかっていたアップロードの部分をコマンドラインから一発で行えるので、とても便利でした。

使わない手はないので、皆さんも是非こちらのツールを利用してアップロードするようにしてみてはいかがでしょうか♪