はじめに
LambdaをGithubでコード管理するにあたり、chaliceを採用したため、chaliceについてまとめます。
chaliceのメリットとして、以下が挙げられます。
- シンプルにLambdaをコード管理できる
- デプロイがSAMに比べて、簡易でデプロイが早い
- 今回は、Lambdaのみですが、API Gateway、S3, SNS, SQSといったAWSサービスも利用できる
- IAM ポリシーを自動生成してくれる
今回は、APIGatewayは、使用せず、複数のLambdaのコード管理をするために、Chaliceを使用します。
IAMユーザーの設定
ローカルのmacのターミナルでchalice
をインストールします。
$ python -V
Python 2.7.18
$ pip install chalice
$ chalice --version
chalice 1.26.0, python 3.9.2, darwin 21.3.0
ChaliceでLambdaをアップするためには、アップするAWSアカウント内でIAMユーザーを作成し、アクセスキーとシークレットキー等の認証情報をローカルの「~/.aws/credentials」
と「~/.aws/config」
に保存する必要があります。
IAMポリシーを以下の権限で作成します。
可能であれば、送信元IP制限すると、セキュリティ面で良いかと思います。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:GetPolicyVersion",
"iam:GetPolicy",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams",
"iam:ListRoles",
"iam:CreateRole",
"iam:PutRolePolicy",
"iam:PassRole",
"iam:ListAttachedRolePolicies",
"iam:DeleteRolePolicy",
"lambda:*",
"logs:GetLogEvents",
"logs:FilterLogEvents",
"iam:ListRolePolicies",
"iam:GetRolePolicy"
],
"Resource": "*"
}
]
}
名前付きプロファイル設定
ローカルで名前を指定したプロファイルを作成します。
defaultとは別に、名前をchalice
としたプロファイルを作成します。
Config プロファイル
には、プレフィックスにprofile
をつけることを忘れないようにしましょう。
アクセスキー と シークレットキー 、regionを記入します。
$ sudo vim ~/.aws/config
[default]
region = ap-northeast-1
output = json
[profile chalice]
region = ap-northeast-1
output = json
source_profile = kimotsuki_taxi_chalice
$ sudo vim ~/.aws/credentials
[default]
aws_access_key_id=xxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxx
[chalice]
aws_access_key_id=xxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxx
Chaliceのプロジェクト作成
プロジェクト名をchalice_test
とし、作成します。
$ chalice new-project chalice_test
Your project has been generated in ./chalice_test
$ cd chalice_test
chalice_test $ ls -la
.chalice
.gitignore
app.py
requirements.txt
今回は、API Gatewayは使用しないため、app.py
ファイルを以下のように修正します。
$ vim app.py
from chalice import Chalice
- app = Chalice(app_name='helloworld')
+ app = Chalice(app_name='chalice_test')
- @app.route('/')
- def index():
- return {'hello': 'world'}
+ @app.lambda_function(name='reservation')
+ def reservation(event, context):
+ return dispatch(event)
chalice デプロイ
デプロイは、ローカル端末で chalice deploy
コマンドを実行するだけです。
「~/.aws/credentials」と「~/.aws/config」で設定されている AWS の認証情報を元に、 Chalice がデプロイを行います。
なお、 Chalice を使う場合には「Lambda 用の IAM ロールにどういったポリシーを付与すべきか」を考慮する必要はありません。
Chalice では API の内容を自動的に判断して、最小限のポリシーを付与してくれるようです。
デプロイのコマンドには、プロファイル名のchalice
を指定して、デプロイしましょう。
--profile chalice
がない場合、プロファイル名default
で設定されたAWSアカウントに対してデプロイされてしまいます。
chalice_test $ chalice deploy --profile chalice
Creating deployment package.
Updating policy for IAM role: chalice_test-dev
Creating lambda function: chalice_test-dev-reservation
Resources deployed:
- Lambda ARN: arn:aws:lambda:ap-northeast-1:xxxxxxxxxx:function:chalice_test-dev-reservation
$ tree -la
.
├── .chalice
│ ├── config.json
│ ├── deployed
│ │ └── dev.json
│ └── deployments
│ └── f7623481a504b5abd265324b4bc6f003-python3.9.zip
├── .gitignore
├── __pycache__
│ └── app.cpython-39.pyc
├── app.py
└── requirements.txt
chalice_test-dev-reservation
というLambdaが作成されました。
Lambdaの開発
Lambdaの開発についてですが、基本app.pyではコードは最小限にし、ルートディレクトリ配下にchalicelib
を作成し、その配下にreservation.py
ファイルを作成し、このファイルにコードを書いて開発します。
$ ls
__pycache__ app.py requirements.txt
$ mkdir chalicelib
$ cd chalicelib
$ touch reservation.py
$ ls
reservation.py
$ vim reservation.py
def dispatch(event):
return { "test" : "reservation"}
$ vim app.py
from chalice import Chalice
+ from chalicelib.reservation import dispatch
app = Chalice(app_name='chalice_test')
@app.lambda_function(name='reservation')
def reservation(event, context):
return dispatch(event)
from chalicelib.reservation import dispatch
の意味は、「chalicelib
ディレクトリ配下のreservation.py
ファイルのdispatch
関数を使用する」を表しております。
それでは、ルートディレクトリ内で、デプロイ後、テストしましょう。
$ cd ..
chalice_test $ chalice deploy --profile chalice
テストを実行すると、問題なく実行されました。
{
"test": "reservation"
}
別のLambdaを作成
もう一つLambdaを作成しましょう。
先程と同様に、chalicelib
配下にファイルを作成します。
$ cd chalicelib
$ touch cancel.py
$ ls
cancel.py
$ vim cancel.py
def cancel_for_user(event):
return { "test" : "cancel"}
$ vim app.py
from chalice import Chalice
from chalicelib.reservation import dispatch
+ from chalicelib.cancel import cancel_for_user
app = Chalice(app_name='chalice_test')
@app.lambda_function(name='reservation')
def reservation(event, context):
return dispatch(event)
+ @app.lambda_function(name='cancel')
+ def cancel(event, context):
+ return cancel_for_user(event)
ルートディレクトリ内で、デプロイ後、テストしましょう。
$ cd ..
chalice_test $ chalice deploy --profile chalice
新しく作成されたchalice_test-dev-cancel
Lambdaのテストをすると、問題なく実行されました。
{
"test": "cancel"
}
Lambda layer
Lambdaでは、Lambda Layer
という、ライブラリや自作モジュールを複数のLambdaに適用できる機能がありますが、chaliceでも使用できます。
Lambda_layerを使用するパターンとして、自作モジュール
と外部ライブラリ
の2パターンがありますので、説明していきます。
自作モジュールの場合
自作モジュールでは、2パターンあります。
AWSコンソールのLambda_layerにアップ
1つ目は、作成した自作モジュールを AWSコンソール のLambda_layerにアップする方法です。
Lambda_layerをアップする方法は、以前記事を書きましたので、参考にするとLambda_layerにアップできます。
アップすると、コンソールのレイヤーから、ARNが発行されますので、コピーしておきます。
.chalice/config.json
ファイルに、layers
を加え、先程コピーしたARNを貼り付けます、
{
"version": "2.0",
"app_name": "chalice_test",
"stages": {
"dev": {
- "api_gateway_stage": "api"
+ "layers": [
+ "arn:aws:lambda:ap-northeast-1:************:layer:python_layer:1",
+ "arn:aws:lambda:ap-northeast-1:************:layer:test:1"
+ ]
}
}
}
これで、作成した自作モジュールを使用できます。
ただし、この方法ですと、自作モジュールを修正するたびに、アップし直す必要があり、手間がかかる場合があります。
その場合は、2つ目の方法が簡単です。
簡易Lambda_layerをchalice内で作成
自作モジュールは、chalice内の複数のLambdaにしか適用しない場合、こちらの方法がおすすめです。
個人的には、自作モジュールの場合、chalicelib
ディレクトリ配下にlambda_layer.py
ファイルを作成し、そこにまとめると良いかと思います。
適当に、lambda_layerの自作モジュールを作成します。
$ vim chalicelib/lambda_layer.py
from datetime import datetime, timedelta
def week_day():
dateJST = datetime.today() + timedelta(hours=9)
weekday = dateJST.strftime('%a')
return weekday
$ vim chalicelib/reservation.py
+ from chalicelib.lambda_layer import week_day
def dispatch(event):
- return { "test" : "reservation"}
+ return {"test" : week_day()}
デプロイし、テストしましょう。
chalice_test $ chalice deploy --profile chalice
問題なく実行されました。
{
"test": "Sun"
}
chalice内の複数のLambdaにしか使えませんが、修正が楽ですね。
外部ライブラリの場合
例として、外部ライブラリのrequests
を使用する方法について説明します。
まずpip list
で、requestsライブラリがインストールされていないか確認します。
外部ライブラリインストール
$ pip list
インストールされていない場合、インストールしましょう
$ pip install requests
Successfully installed requests-2.27.1
WARNING: You are using pip version 21.2; however, version 22.0.4 is available.
You should consider upgrading via the '/usr/local/opt/python@3.9/bin/python3.9 -m pip install --upgrade pip' command.
インストール時の警告
WARNINGとして、pip
のバージョンをインストールするように出ておりますが、アップグレードしないようにしましょう。
Chalice1.26.0 は、pip < 21.3 もしくは、pip >= 9 に依存しています。
pip を 最新バージョン (22.0.4) にした場合、以下のエラーが発生します。
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed.
This behaviour is the source of the following dependency conflicts.
chalice 1.26.0 requires pip < 21.3, >= 9,
but you have pip 22.0.4 which is incompatible.
このエラーの対処として、pip を 21.2までダウングレードしましょう。
$ pip install --upgrade pip==21.2
では、本題に戻ります。
requirements.txt
にrequests
を加えます。イコールは2つですので、注意してください。==
requirements.txt==2.27.1
下記のサイトでもrequests
の最新バージョンが確認できます。
reservation.py で requestsを使用します。
from chalicelib.lambda_layer import week_day
+ import requests
+ request_url = "https://qiita.com/"
+ requests_get = requests.get(request_url)
+ status_code = requests_get.status_code
def dispatch(event):
return {
"test" : week_day(),
+ "module": status_code
}
Lambda layer にまとめるには .chalice/config.json
に以下の通り automatic_layer: true を記載します。
{
"version": "2.0",
"app_name": "chalice_test",
"stages": {
"dev": {
+ "automatic_layer": true,
"layers": [
"arn:aws:lambda:ap-northeast-1:************:layer:python_layer:1",
"arn:aws:lambda:ap-northeast-1:************:layer:test:1"
]
}
}
}
デプロイして、テストを実行しましょう。
$ chalice deploy --profile chalice
Creating shared layer deployment package.
Creating app deployment package.
Creating lambda layer: chalice_test-dev-managed-layer
Updating policy for IAM role: chalice_test-dev
Lambda layerが作成されていることが分かります。
{
"test": "Mon",
"module": 200
}
また、Lambda layer に chalice_test-dev-reservation
という名前で作成されていることが確認できました。
あとは、環境ごとにセットアップなどもやっていきますが、長引きそうなので、次回に続きます。
参照
基本的に、ドキュメントがわかりやすいです。