Table of Contents
Chaliceとは
Chaliceとは、Python で AWS Lambda を用いたサーバーレスアプリケーションを構築するにおいて、
シンプルかつパワフルな機能を持つフレームワークです。
デプロイする時にソースコードを解析して、必要な IAMポリシーを自動的に作成し、更新してくれます。
chalice deployで出たIAMポリシーのエラーと対策
やったこと
Chaliceの公式ページに書いてあった手順に従ってセットアップを始めました。
# chaliceをインストール
$ python3 -m pip install chalice
# 新しいchaliceプロジェクトを作成
$ chalice new-project helloworld
そして、公式のサンプルコードをapp.py
にコピーしました。
from chalice import Chalice
app = Chalice(app_name='helloworld')
@app.route('/')
def index():
return {'hello': 'world'}
公式の手順に従って実装したので、うまくいくはずと思いましたが、、、
エラー
初回のchalice deploy
で以下のエラーが出てきました。
$ chalice deploy
chalice.deploy.deployer.ChaliceDeploymentError:
ERROR - While deploying your chalice application, received the following error:
An error occurred (AccessDenied) when calling the GetRole operation:
User:arn:aws:iam::<account>:user/<app-name> is not authorized to perform:
iam:GetRole on resource: role <app-name>-dev because no identity-based policy
allows the iam:GetRole action
「ChaliceのIAM ユーザはIAM ロールを読み込む権限を持っていないよ」ということです。
エラーメッセージを見て、「あれ、、、必要なポリシーを作成してくれるって言ったじゃん。。。」と思いました。
原因
IAMの公式ドキュメンテーションにこのようなことが書かれています。
IAM エンティティ (ユーザーまたはロール) がサービスロールを作成または編集できるようにするには、アクセス許可を設定する必要があります。
つまり、ChaliceのIAMユーザにIAM ロールを作成・編集する権限を付与しないと、
それを行う権限がないから上記のエラーが出たということです。
対策
以下のポリシーをChaliceのIAMユーザにアタッチしたら解決できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EditSpecificServiceRole",
"Effect": "Allow",
"Action": [
"iam:AttachRolePolicy",
"iam:DeleteRolePolicy",
"iam:DetachRolePolicy",
"iam:GetRole",
"iam:GetRolePolicy",
"iam:ListAttachedRolePolicies",
"iam:ListRolePolicies",
"iam:PutRolePolicy",
"iam:UpdateRole",
"iam:UpdateRoleDescription"
],
"Resource": "arn:aws:iam::*:role/SERVICE-ROLE-NAME"
},
{
"Sid": "ViewRolesAndPolicies",
"Effect": "Allow",
"Action": [
"iam:GetPolicy",
"iam:ListRoles"
],
"Resource": ""
}
]
}
Lambda関数から他のLambda関数を呼び出す権限が自動付与されなかった
出たエラー
あるLambda関数から他のLambda関数を呼び出すときに、下記のエラーが出ました。
AccessDeniedException: User: arn:aws:sts::<account>:assumed-role/<assumed-role-name>/<role-session-name>
is not authorized to perform: lambda:InvokeFunction on resource:
arn:aws:lambda:<region>:<account-id>:function:<resource-id>
Lambda関数を呼び出すためのポリシーが自動生成されなかったということですね。
公式のGithubにも同じようなIssueが上がっています。
手動でIAMロールのポリシーファイルにlambda:InvokeFunction
を書き足したらうまくいきましたが、
デプロイするたびにIAMポリシーが自動的にアップデートされ、
手動で入れたlambda:InvokeFunction
が削除されてしまいます。
原因
公式ドキュメント曰く
“The automatic policy generation is still in the early stages, it should be considered experimental.
自動ポリシー作成機能がまだ安定していないので、Lambda関数から他の関数を呼び出す場合の対応がまだできていないっぽいです。
対策
自動で作成される IAM ロールに必要なポリシーが付与されないのは困るので、
ChaliceのIAMポリシー自動作成機能を使わずに、自分でIAM ポリシーを設定します。
やり方はは簡単で、.chalice/config.json
で下記のような設定をします。
{
"version": "2.0",
"app_name": "app",
"stages": {
"dev": {
"autogen_policy": false
}
}
}
"autogen_policy": false
でポリシーの自動生成を無効にすると、
デフォルトでは、.chalice
内の policy-<stage name>.json
(この場合は policy-dev.json
) が読み込まれます。
policies-dev.json
に下記のように書きます。
{
"Version": "2012-10-17",
"Statement": [
...
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": "*"
}
]
}
これでchalice deploy
すると、うまくデプロイできました。
まとめ
- ChaliceがIAM ロールを作成・編集できるようにするには、Chaliceにそれを行う権限を付与することが必要
- Lambda関数から他の関数を呼び出す場合、IAM Policyが自動生成されない可能性がある
- IAM Policy が自動生成されない場合、自分でPolicyを設定できる
sarah
Company : Fusic CO., LTD