cds-snc / notification-terraform

Terraform for notification.canada.ca
MIT License
13 stars 6 forks source link

Release 2.13.10 #1446

Closed whabanks closed 1 month ago

whabanks commented 1 month ago

Summary | Résumé

Release 2.13.10

Related Issues | Cartes liées

Reviewer checklist | Liste de vérification du réviseur

⚠ If boxes cannot be checked off before merging the PR, they should be moved to the "Release Instructions" section with appropriate steps required to verify before release. For example, changes to celery code may require tests on staging to verify that performance has not been affected.

github-actions[bot] commented 1 month ago

Production: newrelic

✅   Terraform Init: success ✅   Terraform Validate: success ✅   Terraform Format: success ✅   Terraform Plan: success

Plan: 15 to add, 3 to change, 0 to destroy
Show summary | CHANGE | NAME | |--------|--------------------------------------------------------------------------------------------| | update | `newrelic_notification_channel.terraform_notify_channel` | | | `newrelic_notification_destination.terraform_notify_destination` | | | `newrelic_workflow.terraform_notify_workflow` | | add | `newrelic_alert_policy.terraform_notify_policy` | | | `newrelic_nrql_alert_condition.admin_error_percentage` | | | `newrelic_nrql_alert_condition.admin_response_time` | | | `newrelic_nrql_alert_condition.external_services_callbacks_over_5_seconds_duration` | | | `newrelic_nrql_alert_condition.internal_services_awsnotify_over_5_seconds_duration` | | | `newrelic_nrql_alert_condition.k8s_api_error_percentage` | | | `newrelic_nrql_alert_condition.k8s_api_response_time` | | | `newrelic_nrql_alert_condition.k8s_api_transaction_database_time` | | | `newrelic_nrql_alert_condition.lambda_api_error_count_anomaly_fuzzy_attack` | | | `newrelic_nrql_alert_condition.lambda_api_error_percentage_api_user_errors` | | | `newrelic_nrql_alert_condition.lambda_api_error_percentage_fuzzy_attack` | | | `newrelic_nrql_alert_condition.lambda_api_error_percentage_fuzzy_attack_anomaly_detection` | | | `newrelic_nrql_alert_condition.lambda_api_error_percentage_unexpected_errors` | | | `newrelic_nrql_alert_condition.lambda_api_errors_count_anomaly_api_user_errors` | | | `newrelic_nrql_alert_condition.lambda_api_errors_count_anomaly_unexpected_errors` |
Show plan ```terraform Resource actions are indicated with the following symbols: + create ~ update in-place Terraform will perform the following actions: # newrelic_alert_policy.terraform_notify_policy will be created + resource "newrelic_alert_policy" "terraform_notify_policy" { + account_id = (known after apply) + id = (known after apply) + incident_preference = "PER_POLICY" + name = "Notify Policy - production" } # newrelic_notification_channel.terraform_notify_channel will be updated in-place ~ resource "newrelic_notification_channel" "terraform_notify_channel" { id = "718ee534-9e6b-4e30-9c97-fd7ff2b066db" ~ name = "Terraform Notify Slack Channel - production" -> "Notify Slack Channel - production" # (6 unchanged attributes hidden) - property { - key = "payload" -> null - label = "Payload Template" -> null - value = jsonencode({}) } - property { - key = "source" -> null - label = "terraform-source-internal" -> null - value = "terraform" -> null } + property { + key = "payload" + label = "Payload Template" + value = jsonencode({}) } + property { + key = "source" + label = "terraform-source-internal" + value = "terraform" } } # newrelic_notification_destination.terraform_notify_destination will be updated in-place ~ resource "newrelic_notification_destination" "terraform_notify_destination" { id = "929cbc64-548d-492a-996a-57eca3a7028c" ~ name = "Terraform Notify Slack Destination - production" -> "Notify Slack Destination - production" # (5 unchanged attributes hidden) - property { # At least one attribute in this block is (or was) sensitive, # so its contents will not be displayed. } - property { # At least one attribute in this block is (or was) sensitive, # so its contents will not be displayed. } + property { # At least one attribute in this block is (or was) sensitive, # so its contents will not be displayed. } + property { # At least one attribute in this block is (or was) sensitive, # so its contents will not be displayed. } } # newrelic_nrql_alert_condition.admin_error_percentage will be created + resource "newrelic_nrql_alert_condition" "admin_error_percentage" { + account_id = (sensitive value) + aggregation_delay = "120" + aggregation_method = "event_flow" + aggregation_window = 60 + enabled = true + entity_guid = (known after apply) + fill_option = "static" + fill_value = 0 + id = (known after apply) + name = "[Admin] Error percentage" + policy_id = (known after apply) + type = "static" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 259200 + critical { + operator = "above" + threshold = 1 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT ((filter(count(newrelic.timeslice.value), where metricTimesliceName = 'Errors/all') / filter(count(newrelic.timeslice.value), WHERE metricTimesliceName IN ('HttpDispatcher', 'OtherTransaction/all'))) OR 0) * 100 FROM Metric WHERE appId IN (283469061) AND metricTimesliceName IN ('Errors/all', 'HttpDispatcher', 'OtherTransaction/all', 'Agent/MetricsReported/count') FACET appId" } + warning { + operator = "above" + threshold = 0.5 + threshold_duration = 600 + threshold_occurrences = "all" } } # newrelic_nrql_alert_condition.admin_response_time will be created + resource "newrelic_nrql_alert_condition" "admin_response_time" { + account_id = (sensitive value) + aggregation_delay = "120" + aggregation_method = "event_flow" + aggregation_window = 60 + enabled = true + entity_guid = (known after apply) + fill_option = "static" + fill_value = 0 + id = (known after apply) + name = "[Admin] Response time" + policy_id = (known after apply) + type = "static" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 259200 + critical { + operator = "above" + threshold = 0.5 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT filter(average(newrelic.timeslice.value), WHERE metricTimesliceName = 'HttpDispatcher') OR 0 FROM Metric WHERE appId IN (283469061) AND metricTimesliceName IN ('HttpDispatcher', 'Agent/MetricsReported/count') FACET appId" } + warning { + operator = "above" + threshold = 0.2 + threshold_duration = 600 + threshold_occurrences = "all" } } # newrelic_nrql_alert_condition.external_services_callbacks_over_5_seconds_duration will be created + resource "newrelic_nrql_alert_condition" "external_services_callbacks_over_5_seconds_duration" { + account_id = (sensitive value) + aggregation_delay = "120" + aggregation_method = "event_flow" + aggregation_window = 60 + description = (sensitive value) + enabled = true + entity_guid = (known after apply) + id = (known after apply) + name = "[External Services / Callbacks] Over 5 seconds duration" + policy_id = (known after apply) + type = "static" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 3600 + critical { + operator = "above" + threshold = 10 + threshold_duration = 60 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT max(duration) FROM Span WHERE service.name like 'notification-celery-production' AND http.url IS NOT NULL AND http.url not like '%amazonaws.com%' AND http.url not like '%notification.canada.ca%' AND name like 'External%' facet http.url" } } # newrelic_nrql_alert_condition.internal_services_awsnotify_over_5_seconds_duration will be created + resource "newrelic_nrql_alert_condition" "internal_services_awsnotify_over_5_seconds_duration" { + account_id = (sensitive value) + aggregation_delay = "120" + aggregation_method = "event_flow" + aggregation_window = 60 + description = (sensitive value) + enabled = true + entity_guid = (known after apply) + id = (known after apply) + name = "[Internal Services / AWS+Notify] Over 5 seconds duration" + policy_id = (known after apply) + type = "static" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 86400 + critical { + operator = "above" + threshold = 10 + threshold_duration = 60 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT max(duration) FROM Span WHERE service.name like 'notification-celery-production' AND http.url IS NOT NULL AND (http.url like '%amazonaws.com%' OR http.url like '%notification.canada.ca%') AND name like 'External%' facet http.url" } } # newrelic_nrql_alert_condition.k8s_api_error_percentage will be created + resource "newrelic_nrql_alert_condition" "k8s_api_error_percentage" { + account_id = (sensitive value) + aggregation_delay = "120" + aggregation_method = "event_flow" + aggregation_window = 60 + enabled = true + entity_guid = (known after apply) + fill_option = "static" + fill_value = 0 + id = (known after apply) + name = "[k8s API] Error percentage" + policy_id = (known after apply) + type = "static" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 259200 + critical { + operator = "above" + threshold = 2 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT ((filter(count(newrelic.timeslice.value), where metricTimesliceName = 'Errors/all') / filter(count(newrelic.timeslice.value), WHERE metricTimesliceName IN ('HttpDispatcher', 'OtherTransaction/all'))) OR 0) * 100 FROM Metric WHERE appId IN (283468826) AND metricTimesliceName IN ('Errors/all', 'HttpDispatcher', 'OtherTransaction/all', 'Agent/MetricsReported/count') FACET appId" } + warning { + operator = "above" + threshold = 1 + threshold_duration = 300 + threshold_occurrences = "all" } } # newrelic_nrql_alert_condition.k8s_api_response_time will be created + resource "newrelic_nrql_alert_condition" "k8s_api_response_time" { + account_id = (sensitive value) + aggregation_delay = "120" + aggregation_method = "event_flow" + aggregation_window = 60 + enabled = true + entity_guid = (known after apply) + fill_option = "static" + fill_value = 0 + id = (known after apply) + name = "[k8s API] Response time" + policy_id = (known after apply) + type = "static" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 259200 + critical { + operator = "above" + threshold = 0.1 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT filter(average(newrelic.timeslice.value), WHERE metricTimesliceName = 'HttpDispatcher') OR 0 FROM Metric WHERE appId IN (283468826) AND metricTimesliceName IN ('HttpDispatcher', 'Agent/MetricsReported/count') FACET appId" } + warning { + operator = "above" + threshold = 0.05 + threshold_duration = 300 + threshold_occurrences = "all" } } # newrelic_nrql_alert_condition.k8s_api_transaction_database_time will be created + resource "newrelic_nrql_alert_condition" "k8s_api_transaction_database_time" { + account_id = (sensitive value) + aggregation_delay = "120" + aggregation_method = "event_flow" + aggregation_window = 60 + baseline_direction = "lower_only" + enabled = true + entity_guid = (known after apply) + fill_option = "static" + fill_value = 0 + id = (known after apply) + name = "[k8s API] Transaction database time" + policy_id = (known after apply) + type = "baseline" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 259200 + critical { + operator = "above" + threshold = 2.81838 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT filter(average(newrelic.timeslice.value), WHERE metricTimesliceName = 'Datastore/all') OR 0 FROM Metric WHERE appId IN (283468826) AND metricTimesliceName IN ('Datastore/all', 'Agent/MetricsReported/count') FACET appId" } + warning { + operator = "above" + threshold = 2.81838 + threshold_duration = 180 + threshold_occurrences = "all" } } # newrelic_nrql_alert_condition.lambda_api_error_count_anomaly_fuzzy_attack will be created + resource "newrelic_nrql_alert_condition" "lambda_api_error_count_anomaly_fuzzy_attack" { + account_id = (sensitive value) + aggregation_delay = "300" + aggregation_method = "event_flow" + aggregation_window = 60 + baseline_direction = "upper_and_lower" + enabled = false + entity_guid = (known after apply) + id = (known after apply) + name = "[Lambda API] Error count anomaly (Fuzzy attack)" + policy_id = (known after apply) + type = "baseline" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 86400 + critical { + operator = "above" + threshold = 8 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT count(*) FROM AwsLambdaInvocationError WHERE (`entityGuid`='MjY5MTk3NHxJTkZSQXxOQXwxMDg0NzM0MjU4MTkwNzk3NTQz') AND `error.class` IN ('app.authentication.auth:AuthError', 'app.v2.errors:BadRequestError', 'werkzeug.exceptions:MethodNotAllowed')" } + warning { + operator = "above" + threshold = 5 + threshold_duration = 300 + threshold_occurrences = "all" } } # newrelic_nrql_alert_condition.lambda_api_error_percentage_api_user_errors will be created + resource "newrelic_nrql_alert_condition" "lambda_api_error_percentage_api_user_errors" { + account_id = (sensitive value) + aggregation_delay = "300" + aggregation_method = "event_flow" + aggregation_window = 60 + close_violations_on_expiration = true + enabled = true + entity_guid = (known after apply) + expiration_duration = 300 + id = (known after apply) + name = "[Lambda API] Error percentage (API User Errors)" + open_violation_on_expiration = false + policy_id = (known after apply) + type = "static" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 86400 + critical { + operator = "above" + threshold = 2 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT percentage(count(*), WHERE `error.class` IS NOT null)*100 / percentage(count(*), WHERE duration IS NOT null) as 'Error rate (%); filtered' FROM AwsLambdaInvocation, AwsLambdaInvocationError WHERE `entityGuid`='MjY5MTk3NHxJTkZSQXxOQXwxMDg0NzM0MjU4MTkwNzk3NTQz' AND `error.class` IN ('jsonschema.exceptions:ValidationError', 'sqlalchemy.exc:NoResultFound')" } + warning { + operator = "above" + threshold = 1 + threshold_duration = 300 + threshold_occurrences = "all" } } # newrelic_nrql_alert_condition.lambda_api_error_percentage_fuzzy_attack will be created + resource "newrelic_nrql_alert_condition" "lambda_api_error_percentage_fuzzy_attack" { + account_id = (sensitive value) + aggregation_delay = "300" + aggregation_method = "event_flow" + aggregation_window = 60 + close_violations_on_expiration = true + enabled = false + entity_guid = (known after apply) + expiration_duration = 300 + id = (known after apply) + name = "[Lambda API] Error percentage (Fuzzy attack)" + open_violation_on_expiration = false + policy_id = (known after apply) + type = "static" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 86400 + nrql { + data_account_id = (known after apply) + query = "SELECT percentage(count(*), WHERE `error.class` IS NOT null)*100 / percentage(count(*), WHERE duration IS NOT null) as 'Error rate (%); filtered' FROM AwsLambdaInvocation, AwsLambdaInvocationError WHERE `entityGuid`='MjY5MTk3NHxJTkZSQXxOQXwxMDg0NzM0MjU4MTkwNzk3NTQz' AND `error.class` IN ('app.authentication.auth:AuthError', 'app.v2.errors:BadRequestError', 'werkzeug.exceptions:MethodNotAllowed')" } + warning { + operator = "above" + threshold = 15 + threshold_duration = 600 + threshold_occurrences = "all" } } # newrelic_nrql_alert_condition.lambda_api_error_percentage_fuzzy_attack_anomaly_detection will be created + resource "newrelic_nrql_alert_condition" "lambda_api_error_percentage_fuzzy_attack_anomaly_detection" { + account_id = (sensitive value) + aggregation_delay = "300" + aggregation_method = "event_flow" + aggregation_window = 60 + baseline_direction = "upper_only" + close_violations_on_expiration = true + description = <<-EOT Unusual fuzzy attack is detected. EOT + enabled = true + entity_guid = (known after apply) + expiration_duration = 600 + id = (known after apply) + name = "[Lambda API] Error percentage (Fuzzy attack) (Anomaly Detection)" + open_violation_on_expiration = false + policy_id = (known after apply) + type = "baseline" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 86400 + critical { + operator = "above" + threshold = 5 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT percentage(count(*), WHERE `error.class` IS NOT null)*100 / percentage(count(*), WHERE duration IS NOT null) as 'Error rate (%); filtered' FROM AwsLambdaInvocation, AwsLambdaInvocationError WHERE `entityGuid`='MjY5MTk3NHxJTkZSQXxOQXwxMDg0NzM0MjU4MTkwNzk3NTQz' AND `error.class` IN ('app.authentication.auth:AuthError', 'app.v2.errors:BadRequestError', 'werkzeug.exceptions:MethodNotAllowed')" } } # newrelic_nrql_alert_condition.lambda_api_error_percentage_unexpected_errors will be created + resource "newrelic_nrql_alert_condition" "lambda_api_error_percentage_unexpected_errors" { + account_id = (sensitive value) + aggregation_delay = "300" + aggregation_method = "event_flow" + aggregation_window = 60 + close_violations_on_expiration = true + enabled = true + entity_guid = (known after apply) + expiration_duration = 300 + id = (known after apply) + name = "[Lambda API] Error percentage (Unexpected Errors)" + open_violation_on_expiration = false + policy_id = (known after apply) + type = "static" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 86400 + critical { + operator = "above" + threshold = 2 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT percentage(count(*), WHERE `error.class` IS NOT null)*100 / percentage(count(*), WHERE duration IS NOT null) as 'Error rate (%); filtered' FROM AwsLambdaInvocation, AwsLambdaInvocationError WHERE `entityGuid`='MjY5MTk3NHxJTkZSQXxOQXwxMDg0NzM0MjU4MTkwNzk3NTQz' AND `error.class` NOT IN ('app.authentication.auth:AuthError', 'app.v2.errors:BadRequestError','jsonschema.exceptions:ValidationError', 'sqlalchemy.exc:NoResultFound', 'werkzeug.exceptions:MethodNotAllowed') and error.message NOT LIKE '{\\'result\\': \\'error\\', \\'message\\': {\\'password\\': [\\'Incorrect password\\']}}'" } + warning { + operator = "above" + threshold = 1 + threshold_duration = 300 + threshold_occurrences = "all" } } # newrelic_nrql_alert_condition.lambda_api_errors_count_anomaly_api_user_errors will be created + resource "newrelic_nrql_alert_condition" "lambda_api_errors_count_anomaly_api_user_errors" { + account_id = (sensitive value) + aggregation_delay = "300" + aggregation_method = "event_flow" + aggregation_window = 60 + baseline_direction = "upper_and_lower" + enabled = true + entity_guid = (known after apply) + id = (known after apply) + name = "[Lambda API] Errors count anomaly (API User Errors)" + policy_id = (known after apply) + type = "baseline" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 86400 + critical { + operator = "above" + threshold = 12 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT count(*) FROM AwsLambdaInvocationError WHERE (`entityGuid`='MjY5MTk3NHxJTkZSQXxOQXwxMDg0NzM0MjU4MTkwNzk3NTQz') AND `error.class` IN ('jsonschema.exceptions:ValidationError', 'sqlalchemy.exc:NoResultFound')" } + warning { + operator = "above" + threshold = 6 + threshold_duration = 300 + threshold_occurrences = "all" } } # newrelic_nrql_alert_condition.lambda_api_errors_count_anomaly_unexpected_errors will be created + resource "newrelic_nrql_alert_condition" "lambda_api_errors_count_anomaly_unexpected_errors" { + account_id = (sensitive value) + aggregation_delay = "300" + aggregation_method = "event_flow" + aggregation_window = 60 + baseline_direction = "upper_and_lower" + enabled = true + entity_guid = (known after apply) + id = (known after apply) + name = "[Lambda API] Errors count anomaly (Unexpected Errors)" + policy_id = (known after apply) + type = "baseline" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 86400 + critical { + operator = "above" + threshold = 6 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + data_account_id = (known after apply) + query = "SELECT count(*) FROM AwsLambdaInvocationError WHERE (`entityGuid`='MjY5MTk3NHxJTkZSQXxOQXwxMDg0NzM0MjU4MTkwNzk3NTQz') and error.class NOT IN ('app.v2.errors:BadRequestError','jsonschema.exceptions:ValidationError', 'sqlalchemy.exc:NoResultFound', 'app.authentication.auth:AuthError', 'werkzeug.exceptions:MethodNotAllowed') and error.message NOT LIKE '{\\'result\\': \\'error\\', \\'message\\': {\\'password\\': [\\'Incorrect password\\']}}'" } + warning { + operator = "above" + threshold = 3 + threshold_duration = 300 + threshold_occurrences = "all" } } # newrelic_workflow.terraform_notify_workflow will be updated in-place ~ resource "newrelic_workflow" "terraform_notify_workflow" { id = "b6ee8bdc-d939-4091-8e82-6212776c580b" ~ name = "Terraform Notify Workflow - production" -> "Notify Workflow - production" # (7 unchanged attributes hidden) - destination { - channel_id = "718ee534-9e6b-4e30-9c97-fd7ff2b066db" -> null - name = "Terraform Notify Slack Channel - production" -> null - notification_triggers = [ - "ACKNOWLEDGED", - "ACTIVATED", - "CLOSED", ] -> null - type = "SLACK_LEGACY" -> null - update_original_message = true -> null } + destination { + channel_id = "718ee534-9e6b-4e30-9c97-fd7ff2b066db" + name = (known after apply) + notification_triggers = (known after apply) + type = (known after apply) + update_original_message = true } - issues_filter { - filter_id = "4094205a-1bad-443b-8c08-2e2b07f8d41a" -> null - name = "workflow-filter" -> null - type = "FILTER" -> null - predicate { - attribute = "labels.policyIds" -> null - operator = "EXACTLY_MATCHES" -> null - values = [ - "5464898", ] -> null } - predicate { - attribute = "priority" -> null - operator = "EQUAL" -> null - values = [ - "CRITICAL", ] -> null } } + issues_filter { + filter_id = (known after apply) + name = "workflow-filter" + type = "FILTER" + predicate { + attribute = "labels.policyIds" + operator = "EXACTLY_MATCHES" + values = (known after apply) } + predicate { + attribute = "priority" + operator = "EQUAL" + values = [ + "CRITICAL", ] } } } Plan: 15 to add, 3 to change, 0 to destroy. ───────────────────────────────────────────────────────────────────────────── Saved the plan to: plan.tfplan To perform exactly these actions, run the following command to apply: terraform apply "plan.tfplan" ```
github-actions[bot] commented 1 month ago

Production: quicksight

✅   Terraform Init: success ✅   Terraform Validate: success ✅   Terraform Format: success ✅   Terraform Plan: success ✅   Conftest: success

Plan: 0 to add, 1 to change, 0 to destroy
Show summary | CHANGE | NAME | |--------|-------------------------------| | update | `aws_s3_object.manifest_file` |
Show plan ```terraform Resource actions are indicated with the following symbols: ~ update in-place Terraform will perform the following actions: # aws_s3_object.manifest_file will be updated in-place ~ resource "aws_s3_object" "manifest_file" { ~ etag = "3696c2177cd9e1be28ff597c24b10ae0" -> "221f592f333f2fc284626cfdb8c4bc80" id = "quicksight/s3-manifest-sms-usage.json" tags = {} + version_id = (known after apply) # (12 unchanged attributes hidden) } Plan: 0 to add, 1 to change, 0 to destroy. ───────────────────────────────────────────────────────────────────────────── Saved the plan to: plan.tfplan To perform exactly these actions, run the following command to apply: terraform apply "plan.tfplan" ```
Show Conftest results ```sh WARN - plan.json - main - Missing Common Tags: ["aws_cloudformation_stack.sms-usage-notifications"] WARN - plan.json - main - Missing Common Tags: ["aws_iam_policy.quicksight-rds"] WARN - plan.json - main - Missing Common Tags: ["aws_iam_policy.quicksight-s3-usage"] WARN - plan.json - main - Missing Common Tags: ["aws_iam_policy.quicksight_vpc_connection_ec2"] WARN - plan.json - main - Missing Common Tags: ["aws_iam_policy.quicksight_vpc_connection_iam"] WARN - plan.json - main - Missing Common Tags: ["aws_iam_role.quicksight"] WARN - plan.json - main - Missing Common Tags: ["aws_iam_role.vpc_connection_role"] WARN - plan.json - main - Missing Common Tags: ["aws_quicksight_data_set.jobs"] WARN - plan.json - main - Missing Common Tags: ["aws_quicksight_data_set.login_events"] WARN - plan.json - main - Missing Common Tags: ["aws_quicksight_data_set.notifications"] WARN - plan.json - main - Missing Common Tags: ["aws_quicksight_data_set.organisation"] WARN - plan.json - main - Missing Common Tags: ["aws_quicksight_data_set.services"] WARN - plan.json - main - Missing Common Tags: ["aws_quicksight_data_set.sms_usage"] WARN - plan.json - main - Missing Common Tags: ["aws_quicksight_data_set.templates"] WARN - plan.json - main - Missing Common Tags: ["aws_quicksight_data_set.users"] WARN - plan.json - main - Missing Common Tags: ["aws_quicksight_data_source.rds"] WARN - plan.json - main - Missing Common Tags: ["aws_quicksight_data_source.s3_sms_usage"] WARN - plan.json - main - Missing Common Tags: ["aws_quicksight_vpc_connection.rds"] WARN - plan.json - main - Missing Common Tags: ["aws_s3_object.manifest_file"] 38 tests, 19 passed, 19 warnings, 0 failures, 0 exceptions ```