Top View


Author sarah

AWS Chaliceの IAM ポリシー周りで発生するエラーの原因と対処法

2022/06/01

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

sarah

Company : Fusic CO., LTD