投稿日:
2019年1月16日
最終更新日:
【Python3】コマンドラインから簡単にAWS lambdaに関数をアップロード出来ちゃう「lambda-uploader」のインストール方法と使い方【手順まとめ】
YouTubeも見てね♪
ねこじゃすり
猫を魅了する魔法の装備品!
[ノースフェイス] THE NORTH FACE メンズ アウター マウンテンライトジャケット
防水暴風で耐久性抜群なので旅行で大活躍です!
ペヤング ソースやきそば 120g×18個
とりあえず保存食として買っておけば間違いなし!
モンスターエナジー 355ml×24本 [エナジードリンク]
脳を活性化させるにはこれ!
ドラゴンクエスト メタリックモンスターズギャラリー メタルキング
みんな大好き経験値の塊をデスクに常備しておこう!
Bauhutte ( バウヒュッテ ) 昇降式 L字デスク ブラック BHD-670H-BK
メインデスクの横に置くのにぴったりなおしゃれな可動式ラック!
サンディスク microSD 128GB
スマホからSwitchまで使える大容量MicroSDカード!
AWS Lambaへのアップロードを簡単に行いたい
ローカル開発はpython-lambda-localで決まり
先日、python-lambda-localを使ったローカル環境でのPythonによるLambda関数の実装及び動作確認方法についてご紹介致しました。
アップロードがめんどくさい・・・
ローカルでの動作確認は完了したので、実際にAWSに配置したい!となった場合、通常の手段ではとてもめんどくさいのがデメリットと言えるでしょう。
依存するライブラリを含めてZIP化し、マネジメントコンソールからアップロードをする、と言う作業は地味にめんどくさいのですorz
lambda-uploaderならコマンド一発
そんな面倒くさがりな筆者にぴったりなツールを見つけてしまいました!
lambda-uploaderは、ローカルのLambda用のPythonスクリプトをコマンドラインから一発でAWS Lambdaにアップロードしてくれるのです!
使い方もとても簡単で、設定ファイルを用意すれば自動でライブラリを含めたZIPを作成してくれて、アップロード時の設定も行ってくれます。
今回はシンプルなアップロードと動作確認までの手順をご紹介致します♪
手順
lambda-uploaderをインストール
まずはいつも通りpip
コマンドを使ってlambda-uploaderをインストールしましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
まずはメインとなる関数ファイルを用意しましょう。
今回は動くかの確認だけ出来れば良いので、以下のような簡単な関数を用意しましょう。
1
2
3
4
5
|
import requests
def lambda_handler(event, context):
response = requests.get(event['url'])
return 'Status : %d' % response.status_code
|
lambda.json
次にアップロードするLambda関数の概要をまとめたJsonファイルを用意します。
関数名やtimeout/memoryなどを定義します。
1
2
3
4
5
6
7
8
9
|
{
"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
コマンドでサクッと自動生成しちゃいましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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ファイルが肥大化してしまうので、利用するもの以外は削除しておきましょう。
1 |
requests==2.21.0
|
アップロード処理
必要ファイルは用意出来たので、対象ディレクトリに移動してlambda-uploaderを使ったアップロードを実行してみましょう。
1
2
3
|
λ Building Package
λ Uploading Package
λ Fin
|
おぉ!
無事に終わりましたね。
早速AWS cliからLambda関数を取得して確認してみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
{
"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してみましょう。
1
2
3
4
5
6
7
8
9
10
|
{
"name": "lambdaUploaderTest",
"description": "lambda-uploader test",
"region": "ap-northeast-1",
"handler": "lambda_function.lambda_handler",
"role": "arn:aws:iam::189410286346:role/BlogenistBlogSample",
"timeout": 300,
"memory": 128,
"runtime": "python3.6" // 追加
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
{
"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"
}
}
|
正しくRuntimeがpython3.6
に変わりましたね♪
マネジメントコンソールから動作確認
では、次は実際にアップロードされた関数の動作確認を行いましょう。
マネジメントコンソールからアップロードした関数を選択します。
関数を開いたら上部のテストボタンをクリックします。
すると、テストイベントの設定ダイアログが表示されます。
ここでは、以下のようなJsonを定義して作成ボタンをクリックしましょう。
1
2
3
|
{
"url": "https://blogenist.jp"
}
|
すると、今定義したテストイベントを選べるようになるので、そちらを選択した上でテストボタンをクリックしてみましょう。
すると、正常に動作したことが確認出来ます。
あとは、環境変数やAWSサービス等の連携設定を行うことでLambda関数が完成します♪
終わりに
以上のように、手間がかかっていたアップロードの部分をコマンドラインから一発で行えるので、とても便利でした。
使わない手はないので、皆さんも是非こちらのツールを利用してアップロードするようにしてみてはいかがでしょうか♪