chaliceはboto3で使っているメソッドから必要なIAMを自動的に付与(更新しないもできる)する機能を持ってるので、boto3でdynamodbを使ったりすれば、自動で付与されるけど、pynamodbを使った場合はそこまでは面倒見てくれないので、boto3でdynamoを利用せず、pynamodbのモデルしか用意してないと、こんな感じでdynamodbへのポリシーは無視される。

$ chalice gen-policy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cognito-idp:AdminCreateUser",
        "cognito-idp:AdminInitiateAuth",
        "cognito-idp:AdminRespondToAuthChallenge"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "275e6aad3b0a4356ac3b9ab90fbe2422"
    }
  ]
}

なので、手動で管理する必要があるけど、Identity and Access Management (IAM)から編集するのはchalice使う意味なくなるので、.chalice/policy.jsonを利用する。

手動で変更してもいいけど、ミスってもいやなので、適当に下記のapp.pyにboto3でdynamoを操作する記述を追加

dynamodb.get_item(TableName="nanndemoiiyo")
dynamodb.put_item(TableName="nanndemoiiyo")
table = dynamodb.create_table(...

この状態でポリシーを見るとDynamodbのポリシーが入るので、jsonとして保存

$ chalice gen-policy > .chalice/policy.json
$ cat .chalice/policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cognito-idp:AdminCreateUser",
        "cognito-idp:AdminInitiateAuth",
        "cognito-idp:AdminRespondToAuthChallenge"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "c5c6757d1033420fa4ba529b67bd333d"
    },
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:GetItem",
        "dynamodb:PutItem"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "5a2f50fb91a34608b571409e5291041b"
    }
  ]
}

環境によってサフィックスが必要
今回は「.chalice/policy.json」から「.chalice/policy-dev.json」に変更してデプロイ時は「–no-autogen-policy」をつければOK