0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】CDKで「Please grant trust permission for API Gateway and add the required role policy」エラーが出た場合

Posted at

概要

AWS CDKでAPI Gatewayのcloud_watch_roleのIAMロールを明示的に指定して作成しようとすると以下のエラーになりました。

The role ARN does not have required permissions configured. Please grant trust permission for API Gateway and add the required role policy

こちらのエラーの原因と解決方法を紹介します。

前提と原因

前提として、以下のようにAWS CDKでcloud_watch_role=Trueにしてdeployすると、

        api = apigateway.RestApi(self, "Sample-ApiGateway",
            rest_api_name="Sample-ApiGateway",
            description="API Gateway for Sample API",
            cloud_watch_role=True
        )

IAMロールが自動で生成されます。ロールはAWS管理のservice-role/AmazonAPIGatewayPushToCloudWatchLogsがアタッチされていました。

また、cloud_watch_role=Trueとしたことで、CloudWatchログには/aws/apigateway/welcomeというロググループの中に「Cloudwatch logs enabled for API Gateway」と書かれたログが確認できました。

image.png

ちなみにこれは、cloud_watch_roleを書かずに実行しても生成されたので、デフォルトではTrueの動きのようでした。
Falseにすると、IAMロールの自動生成がなく、また、ログも出ないことを確認しました。

API Gateway のステージでログ記録を有効化し、リクエストやレスポンスの詳細なログを CloudWatch Logs に記録するように設定できるので、IAMロール自体は作成したいのですが、自動生成されるものは名前にスタック名が入っていたりやたら長かったりとわかりづらかったので、明示的に指定したいと思いました。

ということで、以下の状態で実行。
IAMポリシーに、自動生成されたロールと同じ内容のポリシーを付与しています。

        api_gateway_role = iam.Role(self, "Sample-ApiGatewayRole",
            assumed_by=iam.ServicePrincipal("apigateway.amazonaws.com"),
            role_name="Sample-ApiGatewayRole"
        )

        api_gateway_role.add_to_policy(iam.PolicyStatement(
            actions=[
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents",
                "logs:GetLogEvents",
                "logs:FilterLogEvents"
            ],
            resources=["*"]
        ))

        api = apigateway.RestApi(self, "Sample-ApiGateway",
            rest_api_name="Sample-ApiGateway",
            description="sample-api-gateway",
            cloud_watch_role=False, # 自動生成をオフ
            deploy=False
        )

        apigateway.CfnAccount(self, "Sample-ApiGatewayAccount",
            cloud_watch_role_arn=api_gateway_role.role_arn
        )

これで行けるはず...!
しかしこれで実行すると、上記の「Please grant trust permission...」というエラーになりました。

なぜだ...

解決方法

しばらく試行錯誤したのですが、解決方法がわからず...
作成されるリソースの依存関係の問題かな?と思い、IAMロール作成とアタッチを分けてデプロイしてみましたが、やはり同じエラーになりました。

しかし、以下で実行するとエラーが出ずに無事に生成されました。

        api_gateway_role = iam.Role(self, "Sample-ApiGatewayRole",
            assumed_by=iam.ServicePrincipal("apigateway.amazonaws.com"),
            role_name="Sample-ApiGatewayRole"
        )

        api_gateway_role.add_managed_policy(
            iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AmazonAPIGatewayPushToCloudWatchLogs")
        )


        api = apigateway.RestApi(self, "Sample-ApiGateway",
            rest_api_name="Sample-ApiGateway",
            description="sample-api-gateway",
            cloud_watch_role=False, # 自動生成をオフ
            deploy=False
        )

        apigateway.CfnAccount(self, "Sample-ApiGatewayAccount",
            cloud_watch_role_arn=api_gateway_role.role_arn
        )

上記の方法は、add_managed_policyservice-role/AmazonAPIGatewayPushToCloudWatchLogsを指定しています。
違いはそこだけでした。

どうしてAWS管理のservice-roleなら成功したのかはよくわかりませんでしたが、エラーは出なくなりましたのでよかった。
理由がわかる方いらっしゃったらぜひ教えてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?