1. 概要
TerraformでAPIGatewayを実装していましたが、Cloudwatchログを有効化したら、権限エラーが発生して、ちょっと躓きました。
Error: updating API Gateway Stage failed: BadRequestException: CloudWatch Logs role ARN must be set in account settings to enable logging
上記のエラーを解消する設定を記載していきます。
2. 権限設定
やることは単純でCloudwatchアクセス用のIAMポリシーとロール作成と作成したロールをAPI Gatewayに適用します。あとはログ設定時の依存関係を設定すれば、エラーが解決します。
Cloudwatchへのログ出力するためのIAMロールとポリシーを作成します。
main.tf
#API Gateway用ロールに設定する信頼されたエンティティ
data "aws_iam_policy_document" "apigateway_iam_policy_dc"{
statement {
effect = "Allow"
principals {
type = "Service"
identifiers = ["apigateway.amazonaws.com"]
}
actions = ["sts:AssumeRole"]
}
}
#API Gateway用のロール作成
resource "aws_iam_role" "apigateway_iam_role"{
name = "apigateway_iam_role"
assume_role_policy = data.aws_iam_policy_document.apigateway_iam_policy_dc.json
}
#Cloudwatchアクセス用の許可権限作成
data "aws_iam_policy_document" "cw_apigateway_policy_dc"{
statement{
effect = "Allow"
actions=[
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams",
"logs:PutLogEvents",
"logs:GetLogEvents",
"logs:FilterLogEvents"
]
resources = ["*"]
}
}
#Cloudwatchアクセス用の許可権限ポリシー作成
resource "aws_iam_policy" "cw_apigateway_policy"{
name = "cw_apigateway_policy"
path = "/"
policy = data.aws_iam_policy_document.cw_apigateway_policy_dc.json
}
#Cloudwatchアクセス用の許可権限ポリシーをロールにアタッチ
resource "aws_iam_policy_attachment" "cw_apigateway_policy_attach"{
name = "cw_apigateway_policy_attach"
policy_arn = aws_iam_policy.cw_apigateway_policy.arn
roles = [
aws_iam_role.apigateway_iam_role.name
]
}
次に、作成したロールをAPIGatewayに適用します。
main.tf
resource "aws_api_gateway_account" "apigateway_account"{
#上記で作成した、ロールを指定
cloudwatch_role_arn = aws_iam_role.apigateway_iam_role.arn
}
最後にAPI Gatewayのログ出力設定をします。
main.tf
resource "aws_api_gateway_method_settings" "apigateway_setting" {
#あらかじめ作成しておいたREST APIを指定
rest_api_id = aws_api_gateway_rest_api.apigateway.id
#あらかじめ作成しておいたステージを指定
stage_name = aws_api_gateway_stage.apigateway_stage.stage_name
method_path = "*/*"
#ログ設定
settings {
metrics_enabled = true
logging_level = "ERROR"
}
#依存関係
depends_on = [
aws_api_gateway_account.apigateway_account
]
}
depends_onは依存関係を示し、指定されたリソース作成後に作成することが出来ます。アカウント設定が先にしないと、権限不足ではじかれるため、依存関係設定を入れておきます。
3. まとめ
権限設定後、何故か権限不足エラーが発生して、躓いていましたが、依存関係入れたら解決しました。