Currently, the only monitoring settings that can be managed when creating a stage are Access logging and X-Ray tracing. Would be great to be able to 'Enable Cloudwatch Logs' and 'Enable Detailed Cloudwatch Metrics'
Not sure if the state of this will change, however I have been working on workaround for this in the meantime. Here is what I have found.
If your using cloudwatch settings (new) - There is the options of "Share your data", "View cross-account cross-region", and "Share your organization account list". You could use the aws console to enable these options ( master org account or sub accounts ). It does seem that these options are not directly available within the aws_cloudwatch* resources in terraform. What these are actually doing is mostly creating Roles and attaching appropriate policies.
"Share your data" - run this within one of your sub accounts:
data "aws_iam_policy_document" "CloudWatch-CrossAccountSharingRole-assume-policy" {
statement {
actions = [
"sts:AssumeRole"
]
principals {
type = "AWS"
identifiers = [
"arn:aws:iam::MASTER ACCOUNT #:root"
]
}
}
provider = aws
}
data "aws_iam_policy" "CloudWatchReadOnlyAccess" {
arn = "arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess"
provider = aws
}
data "aws_iam_policy" "CloudWatchAutomaticDashboardsAccess" {
arn = "arn:aws:iam::aws:policy/CloudWatchAutomaticDashboardsAccess"
provider = aws
}
resource "aws_iam_role" "CloudWatch-CrossAccountSharingRole" {
name = "CloudWatch-CrossAccountSharingRole"
assume_role_policy = data.aws_iam_policy_document.CloudWatch-CrossAccountSharingRole-assume-policy.json
provider = aws
}
resource "aws_iam_role_policy_attachment" "CloudWatchReadOnlyAccess-to-CloudWatch-CrossAccountSharingRole" {
role = aws_iam_role.CloudWatch-CrossAccountSharingRole.name
policy_arn = data.aws_iam_policy.CloudWatchReadOnlyAccess.arn
provider = aws
}
resource "aws_iam_role_policy_attachment" "CloudWatchAutomaticDashboardsAccess-to-CloudWatch-CrossAccountSharingRole" {
role = aws_iam_role.CloudWatch-CrossAccountSharingRole.name
policy_arn = data.aws_iam_policy.CloudWatchAutomaticDashboardsAccess.arn
provider = aws
}
Then for "View cross-account cross-region", and "Share your organization account list" - you would execute this code within your aws master account.
data "aws_iam_policy_document" "CloudWatch-CrossAccountSharing-ListAccountsRole-trust-relationship" {
statement {
actions = [
"sts:AssumeRole"
]
principals {
type = "AWS"
identifiers = [
"arn:aws:iam::acct#1:root",
"arn:aws:iam::acct#2:root",
"arn:aws:iam::acct#3:root",
"arn:aws:iam::acct#4:root"
]
}
}
provider = aws
}
resource "aws_iam_role" "CloudWatch-CrossAccountSharing-ListAccountsRole" {
name = "CloudWatch-CrossAccountSharing-ListAccountsRole"
assume_role_policy = data.aws_iam_policy_document.CloudWatch-CrossAccountSharing-ListAccountsRole-trust-relationship.json
provider = aws
}
data "aws_iam_policy_document" "CloudWatch-CrossAccountSharing-ListAccounts-Policy" {
statement {
actions = [
"organizations:ListAccounts",
"organizations:ListAccountsForParent"
]
resources = [
"*"
]
}
provider = aws
}
resource "aws_iam_role_policy" "CloudWatch-CrossAccountSharing-ListAccounts-Policy" {
name = "CloudWatch-CrossAccountSharing-ListAccounts-Policy"
role = aws_iam_role.CloudWatch-CrossAccountSharing-ListAccountsRole.id
policy = data.aws_iam_policy_document.CloudWatch-CrossAccountSharing-ListAccounts-Policy.json
provider = aws
}
resource "aws_iam_service_linked_role" "AWSServiceRoleForCloudWatchCrossAccount" {
aws_service_name = "cloudwatch-crossaccount.amazonaws.com"
provider = aws
}
If you terraform these resources and then check back into cloudwatch settings ( master account or sub account ) you will see that the settings are now marked as ENABLED.
Hope this helps as a temporary work around
I also need the ability to enable "Enable Detailed CloudWatch Metrics" easily on an API Gateway stage.
Those setting are managed by aws_api_gateway_method_settings
.
Example:
resource "aws_api_gateway_method_settings" "default" {
rest_api_id = "${aws_api_gateway_rest_api.default.id}"
stage_name = "${var.stage_name}"
method_path = "*/*"
settings {
metrics_enabled = true
logging_level = "INFO"
data_trace_enabled = true
}
}
I guess aws_api_gateway_method_settings
resource type name is a little bit confusing. Method
and Stage
are separate resources in API Gateway entities model. Despite Stage
settings may imply to Method
s, they belong to Stage
. This is not reflected in the resource type name.
aws_api_gateway_stage_method_settings
(correlates with API action name and parameter)aws_api_gateway_stage.method_setting
blockresource aws_api_gateway_stage example {
rest_api_id = aws_api_gateway_rest_api.example.id
deployment_id = aws_api_gateway_deployment.example.id
stage_name = "v1"
method_settings {
method_path = "/x"
metrics_enabled = true
data_trace_enabled = true
logging_level = "INFO"
}
method_settings {
method_path = "/y"
metrics_enabled = false
data_trace_enabled = false
logging_level = "ERROR"
}
}
Does it make sense?
Most helpful comment
I also need the ability to enable "Enable Detailed CloudWatch Metrics" easily on an API Gateway stage.